使用通用mapper时在xml自定义一对多 异常No typehandler found for property likeList

通用mapper因为能够极大的提高我们的开发效率,所以在日常开发中已经有越来越多的人在使用它,虽然通用mapper已经给我们封装好了很多的方法供我们直接使用,但是还是有一些情况我们需要自定义sql来应对不同的场景.

前几天在写一个小功能的时候在xml中自定义了一个一对多查询,代码如下

实体类

 

package cn.com.chengzime.domain.model;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;

import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.List;

/**
 * 说明:
 *
 * @author :chengzi
 * Create :2019/7/8 16:53
 */
@Getter
@Setter
@ToString
@Accessors(chain = true)
@Table(name = "user")
public class User {

    /**
     * id
     */
    @Id
    @Column(name = "id")
    private Integer id;

    /**
     * 名称
     */
    @Column(name = "name")
    private String name;

    /**
     * 年龄
     */
    @Column(name = "age")
    private Integer age;


    @Column(name = "likeList")
    private List<Like> likeList;
}

xml

<resultMap id="BaseResultMap" type="cn.com.chengzime.domain.model.User">
    <id column="id" jdbcType="INTEGER" property="id" />
    <result column="name" jdbcType="VARCHAR" property="name" />
    <result column="age" jdbcType="INTEGER" property="age" />
    <collection property="likeList" ofType="cn.com.chengzime.domain.model.Like">
      <result column="like_name" jdbcType="VARCHAR" property="likeName" />
    </collection>
  </resultMap>

  <select id="listUserLike" resultMap="BaseResultMap">
    select
        u.id,
        u.name,
        u.age,
        l.like_name
    from user u left join like l
        on u.id = l.user_id
  </select>

 异常信息

Caused by: tk.mybatis.mapper.MapperException: java.lang.IllegalStateException: No typehandler found for property likeList
	at tk.mybatis.mapper.mapperhelper.MapperTemplate.setSqlSource(MapperTemplate.java:188)
	at tk.mybatis.mapper.mapperhelper.MapperHelper.setSqlSource(MapperHelper.java:245)
	... 55 more
Caused by: java.lang.IllegalStateException: No typehandler found for property likeList
	at org.apache.ibatis.mapping.ResultMapping$Builder.validate(ResultMapping.java:151)
	at org.apache.ibatis.mapping.ResultMapping$Builder.build(ResultMapping.java:140)
	at tk.mybatis.mapper.entity.EntityTable.getResultMap(EntityTable.java:228)
	at tk.mybatis.mapper.mapperhelper.MapperTemplate.setResultType(MapperTemplate.java:137)
	at tk.mybatis.mapper.provider.base.BaseSelectProvider.select(BaseSelectProvider.java:69)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at tk.mybatis.mapper.mapperhelper.MapperTemplate.setSqlSource(MapperTemplate.java:178)
	... 56 more

 运行时发生异常,信息是没有找到likeList属性,进行排查发现问题出在实体类中,user表中其实是没有likeList字段的,我们在user实体类中添加此属性之后,通用mapper在解析的时候发现表中没有此字段,无法完成字段映射,所以抛出了此异常,针对这种问题,通用mapper提供了@Transient注解,我们可以在实体类中对某些字段进行标注,告诉通用mapper忽略此字段:

    @Transient
    private List<Like> likeList;	

这样,再次运行,我们发现异常成功解决了.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值