티스토리 뷰

반응형

 

동적 쿼리 (dynamic sql) : 자바에서 넘어오는 파라미터에 따라 sql 문의 형식이 변경되는 구조입니다.

쿼리를 전체적으로 보았을 때 자주 사용하는 부분은 where절 내이지만 from절에서도 사용 가능합니다. 

이 경우 <if test="condition"></if> 로 감싸주는 데 주의해야 할 점이 있습니다.

 

1. null 체크

<if test='id neq null and id neq ""'>
     and table_name.id = #{id}
</if>

<if test='id != null and id neq ""'>
     and table_name.id = #{id}
</if>

<if test='id != null and !"".equals(id)'>
     and table_name.id = #{id}
</if>

 

2. 문자 비교

<!-- 자바에서 id가 niyong인 경우 분기를 하는 경우입니다 -->
<if test=" 'niyong'.equals(id)">
     and table_name.id = #{id}
</if>

 

3. 문자열 비교

<!-- equalsIgnoreCase -->
<if test=" 'niyong'.equalsIgnoreCase(id)">
     and table_name.id = #{id}
</if>

<!-- == 연산자 사용 -->
<if test=" id == 'niyong'.toString()">
     and table_name.id = #{id}
</if>

<!-- eq 사용 -->
<if test=" id eq 'niyong'.toString()">
     and table_name.id = #{id}
</if>

 


 

아래는 사용해도 적용되지 않는 방법들입니다. 경우를 찾아보니 이런 경우에 왜 에러가 발생하는 지 찾을 수 있었습니다.

<!-- 1) 연산자를 사용한 객체는 자바에서도 허용 불가 -->
<if test='id == "niyong"'>
     and table_name.id = #{id}
</if>

<!-- 2) String.equals(character) 로 취급 -->
<if test="id.equals('niyong')">
     and table_name.id = #{id}
</if>

<!-- 3) java.lang.String 의 .equalsIgnoreCase 와 마찬가지로 위에서 id가 null이면 
exception이 발생하므로 피연산자는 괄호() 안에 적어주어야 합니다. -->
<if test=' id.equalsIgnoreCase("niyong") '>
     and table_name.id = #{id}
</if>

 

결론적으로 character 를 사용하는 케이스가 아니면 바깥쪽은 quote(') 로 감싸주고 안쪽에 비교하는 문자열은 double quote(") 로 감싸주어야 한다는 것을 알았습니다. 

반응형
댓글
공지사항