解决mybatis 中collection嵌套collection引发的bug
我就废话不多说了,大家还是直接看代码吧~
p.Id,p.Name,p.SurName, c.Idasc_Id,c.ParentIdasc_ParentId,c.Nameasc_Name,c.SurNameasc_Surname,c.Ageasc_Age, t.Idast_Id,t.Nameast_Name,t.Colorast_Color select fromParentp leftouterjoinChildconp.Id=c.ParentId leftouterjoinToytonc.Id=t.ChildId wherep.id=#{id,jdbcType=VARCHAR}
表面来看没有任何问题实际查询的child对象中的toys一直是空
类关系介绍:
Parent类有属性ArrayList
Child类有属性ArrayList
Toy是一个普通的类
原因在于:
columnPrefix配置的是t_实际mybatis处理后是c_t_
解决办法:
只需要修改sql修改前缀为c_t_即可
t.Idasc_t_Id,t.Nameasc_t_Name,t.Colorasc_t_Color
补充知识:mybatis嵌套的结果集不能被安全的转为自定义ResultHandler的解决办法
org.mybatis.spring.MyBatisSystemException:nestedexceptionisorg.apache.ibatis.executor.ExecutorException:MappedStatementswithnestedresultmappingscannotbesafelyusedwithacustomResultHandler.UsesafeResultHandlerEnabled=falsesettingtobypassthischeck.
问题描述
session.select("dao.ArticleMapper.selectAll",null,newRowBounds(1,2),resultHandler);
会报不安全,查询Configuration源码发现里面有一个常量是
publicConfiguration(){ this.safeRowBoundsEnabled=false; this.safeResultHandlerEnabled=true;//意思是不允许自定义ResultHand处理器, this.mapUnderscoreToCamelCase=false; this.aggressiveLazyLoading=true;
解决办法
publicstaticSqlSessiongetsqlSession(){ SqlSessionsession=sqlSessionFactory.openSession(ExecutorType.REUSE); Configurationconfiguration=session.getConfiguration();//反射得到configuration,然后 configuration.setSafeResultHandlerEnabled(false);//设置为false returnsession; }
这样就可以了。
以上这篇解决mybatis中collection嵌套collection引发的bug就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。