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>
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.
--- 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
<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>
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>
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
반응형
'SQL > IBATIS' 카테고리의 다른 글
동적 SQL (0) | 2014.03.25 |
---|---|
ibatis 동적 쿼리 예제 (0) | 2014.03.25 |
dynamic 태그, isParameterPresent, removeFirstPrepend 설명 (0) | 2014.03.25 |
조회수 증가 쿼리(ibatis) (0) | 2014.02.19 |
SqlMapClient API를 통해 statement를 수행하기. (0) | 2014.02.19 |
배치(Batches) (0) | 2014.02.19 |
Data Mapper로 프로그래밍하기: The API (0) | 2014.02.19 |
ibatis 에서 iterate 사용 (insert select, union all) (0) | 2014.02.12 |