HasorDB CRUD条件构造器

2022-01-10 10:03 更新

前言​

使用 Java 开发程序最痛苦的事情之一就是要处理动态生成 SQL 的问题,虽然通过 Mapper 文件可以规划生成的 SQL语句。 但在遇到复杂情况时代码方式依然是最佳选择。

提示:
条件构造器可以用于 ​query​、​update​、​delete ​三类操作中,下面以 ​query ​为例展示不同方法对应的的 sql 语句。

条件​

等于 (==)​

LambdaQuery<TestUser> query = lambdaTemplate.lambdaQuery(TestUser.class);
List<TestUser> result = query.eq(TestUser::getAge, 32)
                             .queryForList();

对应的 SQL:

SELECT * FROM test_user WHERE age = ?

不等于 (!=)​

LambdaQuery<TestUser> query = lambdaTemplate.lambdaQuery(TestUser.class);
List<TestUser> result = query.ne(TestUser::getAge, 32)
                             .queryForList();

对应的 SQL:

SELECT * FROM test_user WHERE age <> ?

大于 (>)​

LambdaQuery<TestUser> query = lambdaTemplate.lambdaQuery(TestUser.class);
List<TestUser> result = query.gt(TestUser::getAge, 32)
                             .queryForList();

对应的 SQL:

SELECT * FROM test_user WHERE age > ?

大于等于 (>=)​

LambdaQuery<TestUser> query = lambdaTemplate.lambdaQuery(TestUser.class);
List<TestUser> result = query.ge(TestUser::getAge, 32)
                             .queryForList();

对应的 SQL:

SELECT * FROM test_user WHERE age >= ?

小于 (<)​

LambdaQuery<TestUser> query = lambdaTemplate.lambdaQuery(TestUser.class);
List<TestUser> result = query.lt(TestUser::getAge, 32)
                             .queryForList();

对应的 SQL:

SELECT * FROM test_user WHERE age < ?

小于等于 (<=)​

LambdaQuery<TestUser> query = lambdaTemplate.lambdaQuery(TestUser.class);
List<TestUser> result = query.le(TestUser::getAge, 32)
                             .queryForList();

对应的 SQL:

SELECT * FROM test_user WHERE age <= ?

模糊匹配 (like)​

LambdaQuery<TestUser> query = lambdaTemplate.lambdaQuery(TestUser.class);
List<TestUser> result = query.like(TestUser::getAge, "001")
                             .queryForList();

对应的 SQL:

SELECT * FROM test_user WHERE name LIKE CONCAT('%', ? ,'%')

左半边匹配​

LambdaQuery<TestUser> query = lambdaTemplate.lambdaQuery(TestUser.class);
List<TestUser> result = query.likeLeft(TestUser::getAge, "001")
                             .queryForList();

对应的 SQL:

SELECT * FROM test_user WHERE name LIKE CONCAT('%', ?)

右半边匹配​

LambdaQuery<TestUser> query = lambdaTemplate.lambdaQuery(TestUser.class);
List<TestUser> result = query.likeRight(TestUser::getAge, "001")
                             .queryForList();

对应的 SQL:

SELECT * FROM test_user WHERE name LIKE CONCAT(?, '%')

排除模糊匹配 (not like)​

LambdaQuery<TestUser> query = lambdaTemplate.lambdaQuery(TestUser.class);
List<TestUser> result = query.notLike(TestUser::getAge, "001")
                             .queryForList();

对应的 SQL:

SELECT * FROM test_user WHERE name NOT LIKE CONCAT('%', ? ,'%')

排除左半边匹配​

LambdaQuery<TestUser> query = lambdaTemplate.lambdaQuery(TestUser.class);
List<TestUser> result = query.notLikeLeft(TestUser::getAge, "001")
                             .queryForList();

对应的 SQL:

SELECT * FROM test_user WHERE name NOT LIKE CONCAT('%', ?)

排除右半边匹配​

LambdaQuery<TestUser> query = lambdaTemplate.lambdaQuery(TestUser.class);
List<TestUser> result = query.notLikeRight(TestUser::getAge, "001")
                             .queryForList();

对应的 SQL:

SELECT * FROM test_user WHERE name NOT LIKE CONCAT(?, '%')

为空 (is null)​

LambdaQuery<TestUser> query = lambdaTemplate.lambdaQuery(TestUser.class);
List<TestUser> result = query.isNull(TestUser::getAge)
                             .queryForList();

对应的 SQL:

SELECT * FROM test_user WHERE age IS NULL

不为空 (is not null)​

LambdaQuery<TestUser> query = lambdaTemplate.lambdaQuery(TestUser.class);
List<TestUser> result = query.isNotNull(TestUser::getAge)
                             .queryForList();

对应的 SQL:

SELECT * FROM test_user WHERE age IS NOT NULL

包含 (in)​

List<Integer> argsIn = Arrays.asList(22, 32);
LambdaQuery<TestUser> query = lambdaTemplate.lambdaQuery(TestUser.class);
List<TestUser> result = query10.in(TestUser::getAge, argsIn)
                               .queryForList();

对应的 SQL:

SELECT * FROM test_user WHERE age IN ( ? , ? )

排除 (not in)​

List<Integer> argsNotIn = Arrays.asList(22, 32);
LambdaQuery<TestUser> query = lambdaTemplate.lambdaQuery(TestUser.class);
List<TestUser> result = query10.notIn(TestUser::getAge, argsNotIn)
                               .queryForList();

对应的 SQL:

SELECT * FROM test_user WHERE age NOT IN ( ? , ? )

范围内 (between)​

LambdaQuery<TestUser> query = lambdaTemplate.lambdaQuery(TestUser.class);
List<TestUser> result = query.between(TestUser::getAge, 20, 30)
                             .queryForList();

对应的 SQL:

SELECT * FROM test_user WHERE age BETWEEN ? AND ?

范围外 (not between)​

LambdaQuery<TestUser> query = lambdaTemplate.lambdaQuery(TestUser.class);
List<TestUser> result = query.notBetween(TestUser::getAge, 20, 30)
                             .queryForList();

对应的 SQL:

SELECT * FROM test_user WHERE age NOT BETWEEN ? AND ?

关系式​

当拥有多个条件进行查询时,就会用到关系式。

与关系​

与 是默认关系,因此当多个条件之间都是 与 关系时,可以不指明关系式。例如:

LambdaQuery<TestUser> query = lambdaTemplate.lambdaQuery(TestUser.class);
List<TestUser> result = query.eq(TestUser::getName, "123")
                             .eq(TestUser::getAge, 12)
                             .queryForList();

对应的 SQL:

SELECT * FROM test_user WHERE name = ? AND age = ?

也可以展开写成:

LambdaQuery<TestUser> query = lambdaTemplate.lambdaQuery(TestUser.class);
List<TestUser> result = query.and().eq(TestUser::getName, "123")
                             .and().eq(TestUser::getAge, 12)
                             .queryForList();

或关系​

表示多个条件之间是或关系使用如下方式:

LambdaQuery<TestUser> query = lambdaTemplate.lambdaQuery(TestUser.class);
List<TestUser> result = query.eq(TestUser::getName, "123")
                             .or()
                             .eq(TestUser::getAge, 12)
                             .queryForList();

对应的 SQL:

SELECT * FROM test_user WHERE name = ? OR age = ?

条件嵌套​

在一些较为复杂的条件中可以使用嵌套关系,例如:

LambdaQuery<TestUser> query = lambdaTemplate.lambdaQuery(TestUser.class);
List<TestUser> result = query.and(qc -> {
        qc.like(TestUser::getName, "123").eq(TestUser::getAge, 12);
    }).or(qc -> {
        qc.eq(TestUser::getId, 1);
    }).queryForList();

对应的 SQL:

SELECT * FROM test_user WHERE 
( name LIKE CONCAT('%', ? ,'%') AND age = ? )
OR
( id = ? )
提示:
条件嵌套可以多层


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号