我想引用映射器文件中对象的属性,该对象是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。
答案 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>