MyBatis中foreach标签的collection属性的取值方式

目录
  • foreach标签的collection属性的取值
    • 传的是List列表
    • 传的是Array数组
    • 传的是Map
    • collection属性总结
  • MyBatis使用foreach标签报错
    • 原因
    • 解决方案

foreach标签的collection属性的取值

传的是List列表

接口代码

List<Emp> findEmpByDeptnos(List<Integer> deptnos);

xml配置代码

<select id="findEmpByDeptnos" resultType="Emp" parameterType="list">
    SELECT * FROM emp e
    WHERE e.deptno IN
    <foreach collection="list" item="deptno" open="(" separator="," close=")">
        #{deptno}
    </foreach>
</select>

传的是Array数组

接口代码

List<Emp> findEmpByDeptnos(Integer[] deptnos);

xml配置代码

<select id="findEmpByDeptnos" resultType="Emp" parameterType="int">
    SELECT * FROM emp e
    WHERE e.deptno IN
    <foreach collection="array" item="deptno" open="(" separator="," close=")">
        #{deptno}
    </foreach>
</select>

传的是Map

接口代码

List<Emp> findEmpByDeptnos(Map<String,List<Integer>> deptnos);

xml配置代码

<select id="findEmpByDeptnos" resultType="Emp" parameterType="map">
    SELECT * FROM emp e
    WHERE e.deptno IN
    <foreach collection="myKey" item="deptno" open="(" separator="," close=")">
        #{deptno}
    </foreach>
</select>

collection属性总结

  • 如果传入的参数是List,则填写list
  • 如果传入的参数是数组形式,则填写array
  • 如果是多参数传参,传的是map,则填写列表的键key

MyBatis使用foreach标签报错

在使用mybatis过程中,<foreach>标签算是比较常用的,最近在项目中遇到这样一个问题,使用<foreach>标签循环拼接SQL语句时

报了一个错误:

nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named ‘__frch_name_0’ in ‘class com.stand.modules.address.param.GeneralAddressQueryParam’

比较疑惑,这个标签使用了很多次了,还是第一次遇到这样的问题,通过查阅资料,得到了解决方案。

原因

首先贴出涉及到的实体类、Mapper接口和对应的XML部分代码

用于Mapper接口传参的实体类:

public class GeneralAddressQueryParam implements Serializable {

    /**
     * 地名,多级地名用逗号分隔
     */
    private String names;

    /**
     * 多地名查询条件
     */
    private List<String> nameList;

    public String getNames() {
        return names;
    }

    public void setNames(String names) {
        this.names = names;
    }

    public List<String> getNameList() {
        return nameList;
    }

    public void setNameList(List<String> nameList) {
        this.nameList = nameList;
    }
}

Mapper接口

List<GeneralAddressFullNameDTO> multiNameQuery(GeneralAddressQueryParam queryParam);

XML部分代码

<if test="nameList != null and nameList.size() > 0">
    <foreach collection="nameList" item="name">
        and address like concat('%', #{name}, '%')
    </foreach>
</if>

以上就是问题涉及到的部分代码,出错的原因呢,就是在<foreach>标签中取值出的错,网上查阅资料说是因为parameterType接收的参数不是List导致的,具体情况未核实。

解决方案

解决方法比较简单,或一种取值方式即可,将<foreach>标签中遍历出来的值换做如下方式获取

<if test="nameList != null and nameList.size() > 0">
    <foreach collection="nameList" item="name" index="index">
        and address like concat('%', #{nameList[${index}]}, '%')
    </foreach>
</if>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 详解mybatis foreach collection示例

    在SQL开发过程中,动态构建In集合条件查询是比较常见的用法,在Mybatis中提供了foreach功能,该功能比较强大,它允许你指定一个集合,声明集合项和索引变量,它们可以用在元素体内.它也允许你指定开放和关闭的字符串,在迭代之间放置分隔符.这个元素是很智能的,它不会偶然地附加多余的分隔符. 下面是一个演示示例: <select id="findByIdsMap" resultMap="BaseResultMap"> Select <includ

  • 深入浅析MyBatis foreach标签

    前面我们学习了如何使用 Mybatis if.where.trim 等动态语句来处理一些简单的查询操作.对于一些 SQL 语句中含有 in 条件,需要迭代条件集合来生成的情况,可以使用 foreach 来实现 SQL 条件的迭代. Mybatis foreach 标签用于循环语句,它很好的支持了数据和 List.set 接口的集合,并对此提供遍历的功能.语法格式如下. SELECT * FROM product_ WHERE ID in <foreach item="item"

  • mybatis 中 foreach collection的用法小结(三种)

    foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach元素的属性主要有 item,index,collection,open,separator,close. item表示集合中每一个元素进行迭代时的别名,     index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,     open表示该语句以什么开始,     separator表示在每次进行迭代之间以什么符号作为分隔 符,     close表示以什么结束. 在使用foreach的时候

  • MyBatis中foreach标签的collection属性的取值方式

    目录 foreach标签的collection属性的取值 传的是List列表 传的是Array数组 传的是Map collection属性总结 MyBatis使用foreach标签报错 原因 解决方案 foreach标签的collection属性的取值 传的是List列表 接口代码 List<Emp> findEmpByDeptnos(List<Integer> deptnos); xml配置代码 <select id="findEmpByDeptnos"

  • Mybatis中foreach标签带来的空格\换行\回车问题及解决方案

    原因 在自已做的内容中通过获取多个商品Id,以此来获取多个商品详细信息.但数据库返回的商品信息的顺序与原来List中产品的id顺序并不匹配,这就导致了前端页面商品的信息显示混乱,不匹配. 通过网上找到order by排序可以有效解决这个问题,返回与查询时的产品id顺序一致.还有一点,List时有序的 这里先附带上这个sql语句(只能在数据库中成功) select prod_id, prod_name, price, `describe`, prod_date, prod_pic, integra

  • 解决Mybatis中foreach嵌套使用if标签对象取值的问题

    目录 foreach嵌套使用if标签对象取值问题 大体格式 解决办法 代码如下 Mybatis if 语句嵌套 要求 foreach嵌套使用if标签对象取值问题 最近做项目过程中,涉及到需要在 Mybatis 中 使用 foreach 进行循环读取传入的查询条件,动态拼接SQL语句,接口传入的查询条件格式:{"advanceSearchList":[{"searchType":10,"searchText":"12"}]} ,

  • Mybatis中Mapper标签总结大全

    一.标签分类 定义SQL语句 insert delete update select 配置关联关系 collection association 配置java对象属性与查询结果集中列名的对应关系 resultMap 控制动态SQL拼接 foreach if choose 格式化输出 where set trim 定义常量 sql 其他 include 二.标签总结 1. 基础SQL标签 1.1 查询select 标签属性 id 唯一的名称,对应dao中mapper的接口名称 paramterTy

  • mybatis中resultMap 标签的使用教程

    MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动.创建connection.创建statement.手动设置参数.结果集检索等jdbc繁杂的过程代码. MyBatis特点: 1.开源的优秀持久层框架 2.SQL语句与代码分离 3.面向配置的编程 4.良好支持复杂数据映射 5.动态SQL resultMap 标签: 用来描述如何从数据库结果集中来加载对象 (敲黑板!!)主管数据库的字段和实体类属性的匹配,

  • mybatis的foreach标签语法报错的解决

    目录 foreach标签语法报错 动态sql中foreach标签使用 foreach标签语法报错 开发中因为方便复制了其它的foreach标签,但是在执行时,一直报sql语法错误,没办法自己重写一遍foreach标签, 执行成功. 但是,我还是耐心去找到问题所在: 发现下面的标签后面有一段空字符,注意:前面带点的空格位空白字符,后面两点之间的空格为空字符,至于为什么复制来的标签为什么会带有空字符,而且空字符也带入了sql中,引起sql编译报错.这一点我还不太清楚,,,反正我手打不出空字符. 网上

  • mybatis中bind标签和concat的使用说明

    首先,二种方式都可以用来模糊查询,都能预防 SQL 注入.但是在更换数据库情况下,bind标签通用. <if test=" userName != null and userName !=""> and userName like concat('%' ,#{userName},'%') </if> 使用concat函数连接字符串,在mysql中这个函数支持多个参数,但是在oracle中这个函数只支持2个参数,由于不同数据库之间的语法差异,更换数据库,

  • 基于mybatis中<include>标签的作用说明

    MyBatis中sql标签定义SQL片段,include标签引用,可以复用SQL片段 sql标签中id属性对应include标签中的refid属性.通过include标签将sql片段和原sql片段进行拼接成一个完整的sql语句进行执行. <sql id="sqlid"> res_type_id,res_type </sql> <select id="selectbyId" resultType="com.property.vo

  • mybatis 映射文件中if标签判断字符串相等的两种方式

    mybatis 映射文件中,if标签判断字符串相等,两种方式: 因为mybatis映射文件,是使用的ognl表达式,所以在判断字符串sex变量是否是字符串Y的时候, <if test="sex=='Y'.toString()"> <if test = 'sex== "Y"'> 注意: 不能使用 <if test="sex=='Y'"> and 1=1 </if> 因为mybatis会把'Y'解析为字

随机推荐