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

浏览:36日期:2023-08-09

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

<resultMap 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 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 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 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就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持乐呵呵网。

相关文章: