Mybatis-plus: 关于最新版本BUG(已确定存在) 使用queryWrapper查询select指定枚举属性和typeHandler的属性 它们值为NULL的问题!!!

Created on 4 Aug 2020  ·  26Comments  ·  Source: baomidou/mybatis-plus

当前使用版本(必填,否则不予处理)

3.3.2

该问题是如何引起的?(确定最新版也有问题再提!!!)

在service中使用lambdaQuery().select(XXX)出现的问题.枚举值和typeHandler类型处理的字段值都为NULL

重现步骤(如果有就写完整)

实体的字段:
//枚举字段
private PointTypeEnum pointType;
//数据库存的是varchar的一串数字, 是毫秒时间戳, 通过typeHandler将它的值转成LocalDateTime
@TableField(value = "ctime", typeHandler = BigintToDateTimeTypeHandler.class, fill = FieldFill.INSERT)
private LocalDateTime createTime;

service的操作:
lambdaQuery()
.select(PointRecord::getUserId,PointRecord::getPointType,PointRecord::getCreateTime)
.page(page);

问题描述:
service中查询如果指定select字段查询, 那么枚举类型的值为NULL, 有typeHandler的字段也为NULL 并且没有走进类型处理器里(打断点没进去), 但是去掉select, 也就是查全部字段, 枚举类型的值就有了 typeHandler的处理器也会进去

报错信息

数据为空 null

All 26 comments

那你看执行的sql呢

执行的SQL是正常的 没啥问题

我是指两种sql的select时指定的字段

正常service的操作:
lambdaQuery()
.page(page);

不正常service的操作:
lambdaQuery()
.select(PointRecord::getUserId,PointRecord::getPointType,PointRecord::getCreateTime)
.page(page);

也就是说 不能使用.select() 去指定字段去查询 只能不写.select(),查全部字段就正常

是执行的sql!!!

SELECT user_id,ptype AS pointType,begin_points,points,end_points,ctime AS createTime FROM hhz_point_record DESC LIMIT 0,10

没明白你要看执行的sql有啥用的 因为这个原因很明显是执行完sql之后没走处理 这个sql在数据库执行 都是有数据的
也就是枚举类型的字段值是1 typeHandler字段的值是1595655196481 在service中执行完返回的page的records列表数据中的枚举类型是null typeHandler字段值也是null

不明白你就知道一定是没走处理了?把你两种方式的select的sql都发一下

正常service的操作:
lambdaQuery()
.page(page);

执行sql语句:
SELECT * FROM hhz_point_record DESC LIMIT 0,10

不正常service的操作:
lambdaQuery()
.select(PointRecord::getUserId,PointRecord::getPointType,PointRecord::getCreateTime)
.page(page);

执行sql语句:
SELECT user_id,ptype AS pointType,begin_points,points,end_points,ctime AS createTime FROM hhz_point_record DESC LIMIT 0,10

我打断点测试过 service中lambdaQuery如果指定select查询字段 确实不会走进处理器

好的 测试可以了

这个快照版本
PaginationInnerInterceptor文件缺少net.sf.jsqlparser包
启动项目报错:
Factory method 'mybatisPlusInterceptor' threw exception; nested exception is java.lang.NoClassDefFoundError: net/sf/jsqlparser/expression/Function

检查 jsqlparser 版本冲突

并没有什么冲突的

用maven helper查看只有mybatis-plus-core中有依赖关系

是啊 那现在是什么原因呢?

没找到有冲突的jar

我换回3.3.2版本是正常的net.sf.jsqlparser包
换回你说的快照版本就不行 启动报错
PaginationInnerInterceptor文件缺少net.sf.jsqlparser包是报红的 未引入

@miemieYaho 确认遇到类似问题,QueryWrapper在select()指定字段(包含枚举)的时候,枚举转换器他不工作。

@VeChar 你升级版本就行 最新3.3.3.7-SNAPSHOT是可以的 这个3.3.3应该正式版应该还没发布

@VeChar 你升级版本就行 最新3.3.3.7-SNAPSHOT是可以的 这个3.3.3应该正式版应该还没发布

好的,谢谢。

@miemieYaho 这个问题解决了 但是我发现主键ID又是NULL了 主键ID使用了@TableId("XX") 这样会导致查出来的ID为NULL

3.3.3.8-SNAPSHOT

Was this page helpful?
0 / 5 - 0 ratings