确认

  • [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,不然你的int数组java只能识别为Object数组里的第一个元素