Mybatis查询之级联查询

springboot+mybatis+Oracle 级联查询方法遇到的问题及解决方法

1.上代码:

首先 mybatis 级联查询方法:

<resultMap id="resultMap" type="com.test.entity.SysMenu">
    <id column="ID" property="id" />
    <result column="MENU_NAME" property="menuName" />
    <result column="MENU_URL" property="menuUrl" />
    <result column="PARENT _ID" property="parentId" />
<collection column="ID" property="childrenList" ofType="com.test.entity.SysMenu" javaType="java.util.ArrayList" select="getSubChargeItem"/>
   </resultMap>
<!-- 获取一次菜单 -->
<select id="getMenuListPage" parameterType="com.seari.entity.SysMenu" resultMap="resultSubParentMap">
    SELECT
        menu.ID,
        menu.MENU_NAME,
        menu.MENU_URL,
        menu.PARENT_ID 
    FROM SYS_MENU menu
    <where>
        PARENT_ID = '0'
        <if test="menuName != null and menuName != ''">
            and menu.MENU_NAME like '%'|| #{menuName}||'%'
        </if>
   </where>
</select>
<!-- 获取子级数据 -->
<select id="getSubChargeItem" resultMap="resultSubParentMap" parameterType="string">
    SELECT
    menu.ID,
    menu.MENU_NAME,
    menu.MENU_URL,
    menu.PARENT_ID 
    FROM SYS_MENU menu
    WHERE PARENT _ID = #{ID}
</select>

实体对象:

@Data    
public class SysMenu implements Serializable{

   /**
    * 主键
    */
   private String id;
   /**
    * 菜单名称
    */
   private String menuName;
   /**
    * 菜单跳转路径
    */
   private String menuUrl;
   /**
    * 菜单父级id
    */
   private String parentId;

   /**
    * 子级菜单
    */
   private ArrayList<SysMenu> children;

以上即可实现mybatis的递归获取子父级列表

2.问题:

就是我在请求时,提示错误信息:

org.springframework.http.converter.HttpMessageConversionException: Type definition error: 
[simple type, class org.apache.ibatis.executor.loader.javassist.JavassistProxyFactory$EnhancedResultObjectProxyImpl];
nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class 
org.apache.ibatis.executor.loader.javassist.JavassistProxyFactory$EnhancedResultObjectProxyImpl and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: 
com.seari.entity.ResultBean[\"data\"]->java.util.HashMap[\"result\"]-
>com.github.pagehelper.PageInfo[\"list\"]->com.github.pagehelper.Page[0]-
>com.test.entity.SysMenu_$$_jvstb9c_0[\"childrenList\"]->java.util.ArrayList[0]-
>com.test.entity.SysMenu_$$_jvstb9c_0[\"handler\"])",

3.解决:

原因是mybatis级联查询开启了“懒加载”导致json序列化出错。

因此在<collection/>中关闭懒加载即可:fetchType="eager" 

FetchType.LAZY:懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载

FetchType.EAGER:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载

修改:

<collection column="ID" property="children" ofType="com.seari.entity.SysMenu" fetchType="eager" javaType="java.util.ArrayList" select="getSubChargeItem"/>

或者

@JsonIgnoreProperties(value = {"handler"})
public class SysMenu implements Serializable{
}

作用为:忽略序列化bean过程中抛出的某些异常。

至此 便可实现mybatis级联查询,

工作记录,因此对于一些问题没有深入了解,有不对之处,希望各位大佬指出,小弟定及时改正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值