MyBatis 过滤器构建不喜欢 IN 子句
MyBatis filter building does not like IN clause
所以我通过让用户创建自己的条件来构建自己的过滤。到目前为止一切都很好,直到我需要添加 IN
子句。
Mapper.xml
<select id="selectResultCount"
parameterType="Filter"
resultType="long">
SELECT COUNT(rank)
FROM ${view}
<where>
<if test="conditions != null">
<foreach collection="conditions"
item="condition"
open=""
separator=" AND "
close="">
<if test="condition.operator.value.toString() == 'IN'">
${condition.lhs} in
<foreach collection="condition.getRhsCondition()" item="rhs" open="(" close=")" separator=",">
'${rhs}'
</foreach>
</if>
${condition.lhs} ${condition.operator.value} #{condition.rhs}
</foreach>
</if>
</where>
</select>
因此用户可以构建条件列表,然后我将它们拆解以重建它们。非常简单,例如,他们可以创建类似 myColumn = myParam
的内容,过滤器将创建 sql 查询 Select * From myTable where myColumn = myParam
然而,当用户使用 IN
时,一切都走下坡路:
org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near 'MY_COLUMN'.
### The error may exist in mybatis-mapper.xml
### The error may involve mapper.selectResultCount-Inline
### The error occurred while setting parameters
### SQL: SELECT COUNT(rank) FROM MY_TABLE WHERE MY_COLUMN in ( 'PARAM1' , 'PARAM2' ) MY_COLUMN IN ?
### Cause: com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near 'MY_COLUMN '.
当然这个例子只是取回了结果数,但是问题依旧。为什么 Mybatis 不喜欢 IN
并且有什么办法可以避免这种情况?
您的条件在查询中被输入了两次。
一次通过 if 内的代码正确,第二次通过 if 语句后的代码正确。
您的查询以 "MY_COLUMN IN ?" 结尾:
SELECT COUNT(rank) FROM MY_TABLE WHERE MY_COLUMN in ('PARAM1','PARAM2') MY_COLUMN IN ?
所以我通过让用户创建自己的条件来构建自己的过滤。到目前为止一切都很好,直到我需要添加 IN
子句。
Mapper.xml
<select id="selectResultCount"
parameterType="Filter"
resultType="long">
SELECT COUNT(rank)
FROM ${view}
<where>
<if test="conditions != null">
<foreach collection="conditions"
item="condition"
open=""
separator=" AND "
close="">
<if test="condition.operator.value.toString() == 'IN'">
${condition.lhs} in
<foreach collection="condition.getRhsCondition()" item="rhs" open="(" close=")" separator=",">
'${rhs}'
</foreach>
</if>
${condition.lhs} ${condition.operator.value} #{condition.rhs}
</foreach>
</if>
</where>
</select>
因此用户可以构建条件列表,然后我将它们拆解以重建它们。非常简单,例如,他们可以创建类似 myColumn = myParam
的内容,过滤器将创建 sql 查询 Select * From myTable where myColumn = myParam
然而,当用户使用 IN
时,一切都走下坡路:
org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near 'MY_COLUMN'.
### The error may exist in mybatis-mapper.xml
### The error may involve mapper.selectResultCount-Inline
### The error occurred while setting parameters
### SQL: SELECT COUNT(rank) FROM MY_TABLE WHERE MY_COLUMN in ( 'PARAM1' , 'PARAM2' ) MY_COLUMN IN ?
### Cause: com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near 'MY_COLUMN '.
当然这个例子只是取回了结果数,但是问题依旧。为什么 Mybatis 不喜欢 IN
并且有什么办法可以避免这种情况?
您的条件在查询中被输入了两次。
一次通过 if 内的代码正确,第二次通过 if 语句后的代码正确。
您的查询以 "MY_COLUMN IN ?" 结尾:
SELECT COUNT(rank) FROM MY_TABLE WHERE MY_COLUMN in ('PARAM1','PARAM2') MY_COLUMN IN ?