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

时间:2019-08-28 20:44:13

标签: mybatis

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

<?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: ... 由以下原因引起:org.apache.ibatis.reflection.ReflectionException:在“类RequestFilter”中没有名为“ quarterList javaType = list”的属性的吸气剂。

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

#{quarterList javaType=list} 

#{quarterList} 

它说RequestFilter的typeHandler为null。

1 个答案:

答案 0 :(得分:0)

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

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

<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>