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级联查询,
工作记录,因此对于一些问题没有深入了解,有不对之处,希望各位大佬指出,小弟定及时改正。