abel533 / Mapper

Mybatis Common Mapper - Easy to use
https://mybatis.io
MIT License
7.34k stars 1.63k forks source link

JPA注解@Column在使用@Select自定义SQL时不识别的问题 #588

Closed ydq closed 5 years ago

ydq commented 5 years ago

如题,求助,不知道是我使用上面的问题还是有BUG

实体定义:

@Entity
@Table(name = "test")
@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
public class MybatisEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Integer id;

    @Column(name = "str_column")
    String str;

    @Column(name = "time_column")
    Date time;
}

数据库表结构:

CREATE TABLE `test` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `str_column` varchar(100) DEFAULT NULL COMMENT '字符串字段',
  `time_column` timestamp NULL DEFAULT NULL COMMENT '时间字段',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='测试表'

随便插入一条数据,保证每一列都有值的情况下,

调用方法:

@Select("select * from test where str_column = #{str} limit 1")
MybatisEntity queryBySql(@Param("str") String str);

查询结果,没有任何错误信息,但是只能获取到主键,其他不一致的字段没映射过来?

{
    "id":1
}

另外两列 列名和实体属性名不一样,但是和@Column中的name是一样的,没能正常映射到实体。 如果改成下面的方法 就可以正确获取到(即不使用JPA注解):

@Select("select id,str_column as str,time_column as `time` from test where str_column = #{str} limit 1")
MybatisEntity queryBySql(@Param("str") String str);

同样的情况也出现在xml文件中

不知道是我使用方式的问题,还是手写sql本身就不支持@Column呢?


环境:java8 SpringBoot:2.1.4.RELEASE TK版本:

<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper-spring-boot-starter</artifactId>
    <version>2.1.5</version>
</dependency>
languanghao commented 5 years ago

@Select("select * from test where str_column = #{str} limit 1") 这种是mybatis提供查询方法,@Column是common mapper提供的方法,所以mybatis不会去识别@column注解,在mybatis里,你还要继续注解上

 @Results({
        @Result(property = "firstName", column = "first_name"),
        @Result(property = "lastName", column = "last_name")
    })
ydq commented 5 years ago

@Select("select * from test where str_column = #{str} limit 1") 这种是mybatis提供查询方法,@Column是common mapper提供的方法,所以mybatis不会去识别@column注解,在mybatis里,你还要继续注解上

 @Results({
        @Result(property = "firstName", column = "first_name"),
        @Result(property = "lastName", column = "last_name")
    })

明白了,非常感谢~