728x90
반응형
흠.. 신기한 일이 발생한다. method라는 매개변수는 String 타입의 문자로 issue 등과 같은 넷 중 하나이다. 물론, issue 컬럼과 del 컬럼은 INTEGER 타입이다.(hsql에서 테스트, INT도 동일)
 <select id="numberOf" resultClass="int">
  SELECT
  <isEqual property="method" compareValue="issue">
   issue + 1
  </isEqual>
  <isEqual property="method" compareValue="count">
   issue - del
  </isEqual>
  <isEqual property="method" compareValue="howManyIssued">
   issue
  </isEqual>
  <isEqual property="method" compareValue="howManyDeleted">
   del
  </isEqual>

  FROM ManagedObject WHERE type = #recordType#;
 </select>
 
위의 네 가지 경우 중에서 issue와 count는 정상인데, howMany.. 들을 수행하면 오류가 발생했다. <![CDATA[issue]]>와 같은 것은 소용이 없었고.. 오류 내역은 SQLState 'S0022': 잘못된 컬럼 명이다. 로그를 보면.. 일단.. 쿼리 실행까지는 문제가 없는데 ResultMap을 매핑하면서 문제가 발생한다.
 
PreparedStatement:    SELECT                del      FROM ManagedObject WHERE type = ?;
--- Check the ManagedObject.numberOf-AutoResultMap. 
--- Check the result mapping for the '' property.
 
resultClass를 Integer로 명시했어도 소용이 없는건가?
 
첫번째 해결책.. 명시적으로 resultMap을 정의한다.
결과 값 컬럼에 명시적으로 alias를 지정하는 inline resultMap 기법 사용
(value 대신 아무 문자나 넣어도 됨)
 
 <select id="numberOf" resultClass="int">
  SELECT
  <isEqual property="method" compareValue="issue">
   issue + 1 as value
  </isEqual>
  <isEqual property="method" compareValue="count">
   issue - del as value
  </isEqual>
  <isEqual property="method" compareValue="howManyIssued">
   issue as value
  </isEqual>
  <isEqual property="method" compareValue="howManyDeleted">
   del as value
  </isEqual>
  FROM ManagedObject WHERE type = #recordType#;
 </select>
 
또 한가지 방법은.. 꽁수로 시도해본 것인데
 
 <select id="numberOf" resultClass="int">
  SELECT
  <isEqual property="method" compareValue="issue">
   issue + 1
  </isEqual>
  <isEqual property="method" compareValue="count">
   issue - del
  </isEqual>
  <isEqual property="method" compareValue="howManyIssued">
   issue + 0
  </isEqual>
  <isEqual property="method" compareValue="howManyDeleted">
   del + 0
  </isEqual>

  FROM ManagedObject WHERE type = #recordType#;
 </select>
 
 resultClass="int" 라고 명기해두어도.. 결과가 단일 컬럼일 때 이를 잘 처리하지 못했다.
 
SQL 자체에 익숙한 분들은 이러한 XML의 태깅 방식이 더 번거로워보일 수 있습니다. 선호의 문제이긴 한데.. 손님이라고 밝히신 분께서 답글 올리신 내용을 보니 동일한 내용을 UNION 쿼리를 이용해서도 해결할 수 있더군요.
 
 <select id="numberOf" resultClass="int">
 SELECT issue + 1 FROM ManagedObject WHERE type = #recordType# and 'issue' = #method#
 union all
 SELECT issue - del FROM ManagedObject WHERE type = #recordType# and 'count' = #method#
 union all
 SELECT issue FROM ManagedObject WHERE type = #recordType# and 'howManyIssued' = #method#
 union all
 SELECT del FROM ManagedObject WHERE type = #recordType# and 'howManyDeleted' = #method#
 </select>
 
재밌기는 한데 제가 보기엔 너무 복잡해보입니다. 아무래도 SQL에 익숙하지 못해서인지..^^;
제 선호는 Dynamic Mapped Statement 방식입니다.
 
혹시나 해서 성능 테스트를 해보았습니다. UNION은 대개 성능에 좋지 않은 영향을 미친다는 생각이 있어.. 그러나, 단일 row라.. 밀리세컨드로 해보니.. 대부분의 연산이 둘 다 0.01 초가 걸립니다. UNION이 30번 정도 수행에 전부 0.01, 한번 0.03이 걸리고, Dyna.. 방식은 대부분 역시 0.01이고, 한번 0.02, 두 차례 0 이 찍히더군요.
 
더 세밀하게 하려고 나노초 수준으로 비교해보니..


미세한 세계에서 보니..^^;
반드시 UNION이 느린 것은 아니었습니다.
 
워낙 차이가 미미하지만, 개인적으로는 Dyna 방식이 편차가 적어
좀더 안정적이라는 결론을 내리고 싶습니다.  ㅋㅋ
728x90
반응형
블로그 이미지

nineDeveloper

안녕하세요 현직 개발자 입니다 ~ 빠르게 변화하는 세상에 뒤쳐지지 않도록 우리모두 열심히 공부합시다 ~! 개발공부는 넘나 재미있는 것~!

,