【问题标题】:Use an property of an object which is array of strings in mapper XML使用对象的属性,该属性是映射器 XML 中的字符串数组
【发布时间】:2019-08-28 20:44:13
【问题描述】:

我想在我的映射器文件中引用一个对象中的一个属性,它是一个 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:'class RequestFilter'中名为'quarterList javaType=list'的属性没有getter

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

#{quarterList javaType=list} 

#{quarterList} 

它表示 RequestFilter 的 typeHandler 为空。

【问题讨论】:

    标签: mybatis


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2019-05-11
      • 1970-01-01
      • 2017-06-10
      • 2019-03-10
      • 2017-05-24
      • 2015-09-01
      • 1970-01-01
      • 2012-01-23
      • 2013-01-16
      相关资源
      最近更新 更多