Mybatis 自链接查询 遇到的坑

本文主要介绍了在使用Mybatis进行自链接查询时遇到的两个常见错误:resultMap定义的column超过实体类属性及数据库查询结果不足。通过错误日志分析问题,并提供了实体类示例和相应的Dao mapper文件解决策略。

idea +mybatis+spring+springmvc

错误日志1

Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@880ec60] to prepare test instance [com.soecode.lyf.dao.UserDaoTest@62656be4]
java.lang.IllegalStateException: Failed to load ApplicationContext

这个错误是resultMap 定义的column 多于 实体类的属性,仔细检查

错误日志2

Caused by: org.apache.ibatis.reflection.ReflectionException: Error instantiating class com.soecode.lyf.entity.Menu1 with invalid types (Short,String,String,Short,String) or values (7,menu1.3,edit,1,/menu/queryData). Cause: java.lang.NoSuchMethodException: com.soecode.lyf.entity.Menu1.<init>(java.lang.Short, java.lang.String, java.lang.String, java.lang.Short, java.lang.String)
Caused by: java.lang.NoSuchMethodException: com.soecode.lyf.entity.Menu1.<init>(java.lang.Short, java.lang.String, java.lang.String, java.lang.Short, java.lang.String)

这个是数据库查询的结果少于 定义 resultMap 的column

我的问题示例

实体类1

   
public class Menu {
    private Short id;

    private String title;

    private String iconCls;

    private Short parentId;

    private String url;   

实体类2

public class Menu1 {
    private Short id;

    private String title;

    private String iconCls;

    private Short parentId;

    private String url;
    private List<Menu1> children;



解决

Dao对应的mapper文件  MenuDaoMapper.xml

 <resultMap id="BaseResultMap" type="com.soecode.lyf.entity.Menu1"> 这个改为com.soecode.lyf.entity.menu 否者会报错 错误日志2
        <constructor>
            <idArg column="id" jdbcType="DECIMAL" javaType="java.lang.Short"/>
            <arg column="title" jdbcType="VARCHAR" javaType="java.lang.String"/>
            <arg column="iconCls" jdbcType="VARCHAR" javaType="java.lang.String"/>
            <arg column="parent_id" jdbcType="DECIMAL" javaType="java.lang.Short"/>
            <arg column="url" jdbcType="VARCHAR" javaType="java.lang.String"/>
            <arg column="children" javaType="java.util.List"/> 因为我的数据库里没有这个字段 所以去掉此行 ,我也不知道当时为什么这么写,
        </constructor>
    </resultMap>

    <select id="queryByParentId" resultMap="BaseResultMap" parameterType="java.lang.Short">
        select
        <include refid="Base_Column_List"/>
        from menu
        where parent_id = #{id,jdbcType=DECIMAL}
        ORDER BY title DESC
    </select>
 <select id="queryAll" resultMap="q1">
        select
        <include refid="Base_Column_List"/>
        from menu
        WHERE parent_id is NULL
    </select>

    <resultMap id="q1" type="com.soecode.lyf.entity.Menu1">
        <id column="id" property="id"  jdbcType="DECIMAL" javaType="java.lang.Short"/>
        <result column="title" property="title" jdbcType="DECIMAL" javaType="java.lang.String"/>
        <result column="iconCls" property="iconCls" jdbcType="VARCHAR" javaType="java.lang.String"/>
        <result column="parent_id" property="parent_id" jdbcType="DECIMAL" javaType="java.lang.Short"/>
        <result column="url" property="url" jdbcType="VARCHAR" javaType="java.lang.String"/>
        <collection property="children" ofType="com.soecode.lyf.entity.Menu1"
                    select="queryByParentId" column="id"/>
    </resultMap>




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值