使用对象的 属性,它是映射器 XML 中的字符串数组

Use an property of an object which is array of strings in mapper XML

我想在我的映射器文件中的对象中引用 属性,它是 SQL IN 条件中的字符串数组。查询进行计数,因此 return 所需的只是一个数值。查询需要根据过滤器对象中定义的一组灵活的标准来调整其计数。一些过滤器将存在(即不为空),而其他过滤器将不存在。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="TotalUniqueUsers">
    <select id="getTotalUniqueUsers" 
            resultType="int" 
            parameterType="RequestFilter">
         SELECT *
         FROM MY_TABLE
         WHERE 
         <if test="quarterList!=null and quarterList.length>0">
             AND trim(FISCAL_QUARTER_NAME) IN #{quarterList javaType=list}
         </if>
    </select>
</mapper>


public class RequestFilter {
    private String[] quarterList;
    public String[] getQuarterList(){
        return this.quarterList;
    }
    public void setQuarterList(String[] quarterList){
        this.quarterList=quarterList;
    }
}

请注意,RequestFilter 没有类型处理程序。我不认为我需要一个。我不是想把一个对象以某种奇怪的方式浓缩成一个领域。我想要做的就是有一个输入参数

通过以上,我得到 org.apache.ibatis.exceptions.PersistenceException: ... Caused by: org.apache.ibatis.reflection.ReflectionException: 在 'class RequestFilter'

中没有名为 'quarterList javaType=list' 的 属性 的 getter

我也尝试了 javaType=Array,但得到了相同的结果。如果我改变

#{quarterList javaType=list} 

#{quarterList} 

它说 RequestFilter 的 typeHandler 为 null。

在 JDBC 中没有可移植的方法将列表或数组设置为 IN 准备语句参数,因此在 mybatis 中(如果您使用 ways 可以做到这一点postgres).

所以在一般情况下,您需要使用列表中每个元素的参数动态生成查询:

<select id="getTotalUniqueUsers" 
        resultType="int" 
        parameterType="RequestFilter">
     SELECT *
     FROM MY_TABLE
     WHERE 
     <if test="quarterList!=null and quarterList.length>0">
         trim(FISCAL_QUARTER_NAME) IN (             
            <foreach item='quarter' collection='quarterList' separator=','>
               #{quarter}
            </foreach>
         )
     </if>
</select>