解决mybatis 中collection嵌套collection引发的bug

 更新时间:2020年12月01日 11:57:31   作者:AndyMocan  
这篇文章主要介绍了解决mybatis 中collection嵌套collection引发的bug,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

我就废话不多说了,大家还是直接看代码吧~

<resultMap id="ParentMap" type="org.example.mybatis.Parent">
  <id column="Id" jdbcType="VARCHAR" property="id" />
  <result column="Name" jdbcType="VARCHAR" property="name" />
  <result column="SurName" jdbcType="VARCHAR" property="surName" />
 
  <collection property="children"
    javaType="ArrayList" ofType="org.example.mybatis.Child"
    resultMap="ChildMap" columnPrefix="c_"/>  
  
</resultMap>
 
<resultMap id="ChildMap" type="org.example.mybatis.Child">
  <id column="Id" jdbcType="VARCHAR" property="id" />
  <result column="ParentId" jdbcType="VARCHAR" property="parentId" />
  <result column="Name" jdbcType="VARCHAR" property="name" />
  <result column="SurName" jdbcType="VARCHAR" property="surName" />
  <result column="Age" jdbcType="INTEGER" property="age" />
 
  <collection property="toys"
    javaType="ArrayList" ofType="org.example.mybatis.Toy"
    resultMap="ToyMap" columnPrefix="t_"/>  
 
</resultMap>
 
<resultMap id="ToyMap" type="org.example.mybatis.Toy">
  <id column="Id" jdbcType="VARCHAR" property="id" />
  <result column="ChildId" jdbcType="VARCHAR" property="childId" />
  <result column="Name" jdbcType="VARCHAR" property="name" />
  <result column="Color" jdbcType="VARCHAR" property="color" />
</resultMap>
 
<sql id="Parent_Column_List">
  p.Id, p.Name, p.SurName,
</sql> 
 
<sql id="Child_Column_List">
  c.Id as c_Id, c.ParentId as c_ParentId, c.Name as c_Name, c.SurName as c_Surname, c.Age as c_Age,
</sql>
 
<sql id="Toy_Column_List">
  t.Id as t_Id, t.Name as t_Name, t.Color as t_Color
</sql> 
 
<select id="getParent" parameterType="java.lang.String" resultMap="ParentMap" >
  select 
  <include refid="Parent_Column_List"/>
  <include refid="Child_Column_List" />
  <include refid="Toy_Column_List" />
  from Parent p
 
  left outer join Child c on p.Id = c.ParentId
  left outer join Toy t on c.Id = t.ChildId
  where p.id = #{id,jdbcType=VARCHAR}
</select>

表面来看没有任何问题 实际 查询的child对象中的toys一直是空

类关系介绍:

Parent类有属性ArrayList<Child> children

Child类有属性ArrayList<Toy> toys

Toy是一个普通的类

原因在于:

<collection property="toys"
    javaType="ArrayList" ofType="org.example.mybatis.Toy"
    resultMap="ToyMap" columnPrefix="t_"/>  

columnPrefix配置的是t_实际mybatis处理后是 c_t_

解决办法:

只需要修改 sql 修改前缀为 c_t_ 即可

<sql id="Toy_Column_List">
  t.Id as c_t_Id, t.Name as c_t_Name, t.Color as c_t_Color
</sql> 

补充知识:mybatis 嵌套的结果集不能被安全的转为自定义ResultHandler 的解决办法

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.ExecutorException: Mapped Statements with nested result mappings cannot be safely used with a custom ResultHandler. Use safeResultHandlerEnabled=false setting to bypass this check.

问题描述

session.select("dao.ArticleMapper.selectAll", null, new RowBounds(1, 2),resultHandler);

会报不安全, 查询Configuration 源码发现里面有一个常量是

public Configuration() {
  this.safeRowBoundsEnabled = false;
  this.safeResultHandlerEnabled = true;//意思是不允许自定义ResultHand 处理器, 
  this.mapUnderscoreToCamelCase = false;
  this.aggressiveLazyLoading = true;

解决办法

  public static SqlSession getsqlSession(){
  SqlSession session = sqlSessionFactory.openSession(ExecutorType.REUSE);
  Configuration configuration = session.getConfiguration(); //反射得到configuration ,然后
  configuration.setSafeResultHandlerEnabled(false); // 设置为false
  return session;
}

这样就可以了。

以上这篇解决mybatis 中collection嵌套collection引发的bug就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java框架基础之SPI机制实现及源码解析

    java框架基础之SPI机制实现及源码解析

    这篇文章主要为大家介绍了java框架基础之SPI机制实现及源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 简单了解Java删除字符replaceFirst原理及实例

    简单了解Java删除字符replaceFirst原理及实例

    这篇文章主要介绍了简单了解Java删除字符replaceFirst原理及实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Java实现的猜数字游戏示例

    Java实现的猜数字游戏示例

    这篇文章主要介绍了Java实现的猜数字游戏,涉及Java数学运算与判断相关操作技巧,需要的朋友可以参考下
    2018-06-06
  • java进制转换工具类实现减少参数长度

    java进制转换工具类实现减少参数长度

    这篇文章主要为大家介绍了java进制转换工具类实现减少参数长度示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • RocketMQ4.5.2 修改mqnamesrv 和 mqbroker的日志路径操作

    RocketMQ4.5.2 修改mqnamesrv 和 mqbroker的日志路径操作

    这篇文章主要介绍了RocketMQ 4.5.2 修改mqnamesrv 和 mqbroker的日志路径操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java数据结构中双向链表的实现

    Java数据结构中双向链表的实现

    这篇文章主要介绍了Java数据结构中双向链表的实现,双向链表是一种常见的数据结构,它允许在链表中的任意位置进行高效的插入和删除操作,需要的朋友可以参考下
    2022-05-05
  • Java Socket通信介绍及可能遇到的问题解决

    Java Socket通信介绍及可能遇到的问题解决

    最近在学习Java中的Socket通信,所以下面这篇文章主要给大家介绍了关于Java Socket通信介绍及可能遇到问题的解决方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起看看吧。
    2017-10-10
  • 十五道tomcat面试题,为数不多的机会!

    十五道tomcat面试题,为数不多的机会!

    这篇文章主要介绍了十五道tomcat面试题,Tomcat的本质是一个Servlet容器。一个Servlet能做的事情是:处理请求资源,并为客户端填充response对象,需要的朋友可以参考下
    2021-08-08
  • Java求1+2!+3!+...+20!的和的代码

    Java求1+2!+3!+...+20!的和的代码

    这篇文章主要介绍了Java求1+2!+3!+...+20!的和的代码,需要的朋友可以参考下
    2017-02-02
  • JVM内存溢出和内存泄漏的区别及说明

    JVM内存溢出和内存泄漏的区别及说明

    这篇文章主要介绍了JVM内存溢出和内存泄漏的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02

最新评论