跳到主要内容

3.2 条件构造器

条件方法一览

方法说明示例
isNull(字段)为空column IS NULL
isNotNull(字段)不为空column IS NOT NULL
eq(字段, 值)等于column = ?
ne(字段, 值)不等于column <> ?
gt(字段, 值)大于column > ?
ge(字段, 值)大于等于column >= ?
lt(字段, 值)小于column < ?
le(字段, 值)小于等于column <= ?
in(字段, 值列表)在列表中column IN (...)
notIn(字段, 值列表)不在列表中column NOT IN (...)
like(字段, 值)模糊匹配column LIKE '%值%'
likeLeft(字段, 值)后缀匹配column LIKE '%值'
likeRight(字段, 值)前缀匹配column LIKE '值%'
notLike(字段, 值)非模糊column NOT LIKE '%值%'
between(字段, 值1, 值2)范围column BETWEEN ? AND ?
notBetween(字段, 值1, 值2)非范围column NOT BETWEEN ? AND ?

基础条件

DB.pojo.selectWrapper(User.class)
.eq(User::getStatus, 1) // status = 1
.ne(User::getType, 0) // type &lt;> 0
.gt(User::getAge, 18) // age > 18
.ge(User::getScore, 60) // score >= 60
.lt(User::getLevel, 10) // level &lt; 10
.le(User::getRetryCount, 3) // retry_count &lt;= 3
.isNull(User::getDeleteTime) // delete_time IS NULL
.isNotNull(User::getEmail) // email IS NOT NULL
.queryBeanList();

IN / BETWEEN 查询

// IN:支持字符串、数组、子查询
.in(User::getId, "1,2,3,4,5")
.in(User::getId, Arrays.asList(1, 2, 3))
.in(User::getDeptId, "sql:SELECT id FROM dept WHERE status = 1")

// NOT IN
.notIn(User::getName, "admin,root")

// BETWEEN
.between(User::getAge, 18, 30)
.between(User::getAge, "18,30")

// NOT BETWEEN
.notBetween(User::getScore, 0, 60)

模糊查询

DB.pojo.selectWrapper(User.class)
.like(User::getName, "张") // LIKE '%张%'
.likeLeft(User::getPhone, "138") // LIKE '%138'
.likeRight(User::getAddress, "北京") // LIKE '北京%'
.notLike(User::getDescription, "测试") // NOT LIKE '%测试%'
.queryBeanList();

OR / AND 嵌套

// (status=1) AND (name='张三' OR age>20)
DB.pojo.selectWrapper(User.class)
.eq(User::getStatus, 1)
.ors(w -> w.eq(User::getName, "张三").gt(User::getAge, 20))
.queryBeanList();

// (type=1 OR type=2) AND (status=1 AND level>3)
DB.pojo.selectWrapper(User.class)
.ors(w -> w.eq(User::getType, 1).eq(User::getType, 2))
.ands(w -> w.eq(User::getStatus, 1).gt(User::getLevel, 3))
.queryBeanList();

自定义 SQL 片段

// 使用 #{key} 命名参数
DB.pojo.selectWrapper(User.class)
.sql("age > #{minAge} AND age &lt; #{maxAge}",
new JSONMap("minAge", 18, "maxAge", 60))
.queryBeanList();

// EXISTS 查询
DB.pojo.selectWrapper(User.class)
.sql("EXISTS (SELECT 1 FROM vip WHERE user_id = t.id AND level >= #{lv})",
new JSONMap("lv", 3))
.queryBeanList();

Lambda 表达式(类型安全)

所有条件方法都支持 Lambda 和字符串两种方式:

// ✅ Lambda 方式:编译期检查
.eq(User::getStatus, 1)

// ✅ 字符串方式:适合动态场景
.eq("status", 1)

字段名解析规则:

Lambda数据库字段
User::getUserNameuser_name(驼峰转下划线)
User::getIdid
User::getCreateTimecreate_time
@TableField("email_address")email_address(注解覆盖)

空值自动忽略

// 三参形式:条件为 false 时不添加
.eq(name != null, "name", name)

// SQL 方括号:参数为 null 时整个条件忽略
// SQL: [AND status = #{status}]

复用条件

8.0 的稳定业务 API 是在各类 Wrapper 上直接构建条件。Condition 位于 com.dlz.db.internal 实现包,不应在业务代码中直接导入或作为自定义 API 的参数类型。需要复用时,将条件组装封装成面向具体 Wrapper 的业务方法:

private PojoQuery<User> activeAdults(PojoQuery<User> query) {
return query.eq(User::getStatus, 1)
.gt(User::getAge, 18);
}

List<User> users = activeAdults(DB.pojo.selectWrapper(User.class))
.queryBeanList();