当前使用版本(必填,否则不予处理)
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
Comment From: miemieYaho
那你看执行的sql呢
Comment From: abc136609517
执行的SQL是正常的 没啥问题
Comment From: miemieYaho
我是指两种sql的select时指定的字段
Comment From: abc136609517
正常service的操作: lambdaQuery() .page(page);
不正常service的操作: lambdaQuery() .select(PointRecord::getUserId,PointRecord::getPointType,PointRecord::getCreateTime) .page(page);
Comment From: abc136609517
也就是说 不能使用.select() 去指定字段去查询 只能不写.select(),查全部字段就正常
Comment From: miemieYaho
是执行的sql!!!
Comment From: abc136609517
SELECT user_id,ptype AS pointType,begin_points,points,end_points,ctime AS createTime FROM hhz_point_record DESC LIMIT 0,10
Comment From: abc136609517
没明白你要看执行的sql有啥用的 因为这个原因很明显是执行完sql之后没走处理 这个sql在数据库执行 都是有数据的 也就是枚举类型的字段值是1 typeHandler字段的值是1595655196481 在service中执行完返回的page的records列表数据中的枚举类型是null typeHandler字段值也是null
Comment From: miemieYaho
不明白你就知道一定是没走处理了?把你两种方式的select的sql都发一下
Comment From: abc136609517
正常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
Comment From: abc136609517
我打断点测试过 service中lambdaQuery如果指定select查询字段 确实不会走进处理器
Comment From: miemieYaho
用 3.3.3.7-SNAPSHOT,仓库: https://oss.sonatype.org/content/repositories/snapshots/
Comment From: abc136609517
好的 测试可以了
Comment From: abc136609517
这个快照版本 PaginationInnerInterceptor文件缺少net.sf.jsqlparser包 启动项目报错: Factory method 'mybatisPlusInterceptor' threw exception; nested exception is java.lang.NoClassDefFoundError: net/sf/jsqlparser/expression/Function
Comment From: miemieYaho
检查 jsqlparser 版本冲突
Comment From: abc136609517
并没有什么冲突的
Comment From: abc136609517
用maven helper查看只有mybatis-plus-core中有依赖关系
Comment From: miemieYaho
extension 是依赖 core的, https://gitee.com/baomidou/mybatis-plus-samples/blob/master/mybatis-plus-sample-pagination/src/test/java/com/baomidou/mybatisplus/samples/pagination/PaginationTest.java
Comment From: abc136609517
是啊 那现在是什么原因呢?
Comment From: abc136609517
没找到有冲突的jar
Comment From: abc136609517
我换回3.3.2版本是正常的net.sf.jsqlparser包 换回你说的快照版本就不行 启动报错 PaginationInnerInterceptor文件缺少net.sf.jsqlparser包是报红的 未引入
Comment From: beyoug
@miemieYaho 确认遇到类似问题,QueryWrapper在select()指定字段(包含枚举)的时候,枚举转换器他不工作。
Comment From: abc136609517
@VeChar 你升级版本就行 最新3.3.3.7-SNAPSHOT是可以的 这个3.3.3应该正式版应该还没发布
Comment From: beyoug
@VeChar 你升级版本就行 最新3.3.3.7-SNAPSHOT是可以的 这个3.3.3应该正式版应该还没发布
好的,谢谢。
Comment From: abc136609517
@miemieYaho 这个问题解决了 但是我发现主键ID又是NULL了 主键ID使用了@TableId("XX") 这样会导致查出来的ID为NULL
Comment From: miemieYaho
用 3.3.3.8-SNAPSHOT
Comment From: sabrinawen
3.4.2 同问