跳到主要内容

2.3 条件构造器

条件方法一览

方法说明示例
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.select(User.class)
.eq(User::getStatus, 1) // status = 1
.ne(User::getType, 0) // type <> 0
.gt(User::getAge, 18) // age > 18
.ge(User::getScore, 60) // score >= 60
.lt(User::getLevel, 10) // level < 10
.le(User::getRetryCount, 3) // retry_count <= 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.select(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.select(User.class)
.eq(User::getStatus, 1)
.or(w -> w.eq(User::getName, "张三").gt(User::getAge, 20))
.queryBeanList();

// (type=1 OR type=2) AND (status=1 AND level>3)
DB.Pojo.select(User.class)
.or(w -> w.eq(User::getType, 1).eq(User::getType, 2))
.and(w -> w.eq(User::getStatus, 1).gt(User::getLevel, 3))
.queryBeanList();

自定义 SQL 片段

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

// EXISTS 查询
DB.Pojo.select(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}]

独立 Condition

Condition condition = Condition.where()
.eq("status", 1)
.gt("age", 18);

// 复用到不同操作
DB.Table.select("user").where(condition).queryList();
DB.Table.update("user").set("flag", 1).where(condition).execute();
DB.Table.delete("user").where(condition).execute();