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 ?