确认
- [x] 我的版本是最新版本, 我的版本号与 version 相同, 并且项目里无依赖冲突
- [x] 我已经在 issue 中搜索过, 确认问题没有被提出过
- [x] 我已经修改标题, 将标题中的 描述 替换为你的想法(不得删除 描述 前面的部分)
功能改进
我在实体中定义了一个枚举类型的字段
public enum JobState {
New(0),
InProgress(1),
Completed(2),
Acceptance(3);
@EnumValue
private final int value;
public int value() {
return this.value;
}
}
public class JobEntity {
private Long id;//其他字段
private JobState state;//自定义枚举类型
}
写了一个条件查询,可以支持多状态的查询
getJobs(int[] jobStates,String name){
var query = new LambdaQueryWrapper<JobEntity>();
query.like(StringUtils.isNotBlank(namePattern), JobEntity::getName, name);
query.in(jobStates != null && jobStates.length > 0, JobEntity::getState, jobStates);
var result = jobMapper().selectList(query);
}
得到的查询结果完全不对! 用p6spy看了下执行的sql语句:
sql:SELECT id,name,state,createdTime,updatedTime,deleted FROM job WHERE deleted=0 AND (state IN ('[I@15f5940a')) ORDER BY id ASC LIMIT 10
这里的IN操作的对象没有变成正真数据库能理解的字符,还是个java对象。
我需要在查询前把 int[]
转化成 JobState[]
格式,再把它传给LambdaQueryWrapper
才能得到正确的IN查询结果。
这个操作就很迷惑了。因为已经在枚举定义时制定了int value
作为数据库存储值对象,而查询时又不能传int[]
。
看是否要怎么调整 @EnumValue
的处理方式不? 或者别的优雅的处理方式
参考资料
No response
Comment From: itachijames
另一个有问题的地方,就是Wrapper
里的条件构造器:
queryWrapper.in(condition,column,values)
当第一个参数condition
判断为false的情况下,还是可能会继续执行后面的逻辑(比如给第三个参数values
写一个获取值的表达式)
这就带来了问题: 当我在condition
设置成非空判断时,values
的表达式就没有做非空判断、而是直接获取值,从而就会带来运行时异常。
虽然这个问题很好解决,把condition
的判断提出来放在一个if
里就行,但这和condition
参数设计初衷(简化代码)就背离了。
Comment From: huayanYu
虽然这个问题很好解决,把
condition
的判断提出来放在一个if
里就行,但这和condition
参数设计初衷(简化代码)就背离了。 你可以自己写一个其他工具类测试下你的想法。
Comment From: miemieYaho
把你int数组转成LIst