QueryDSL 提供了一系列方法来帮助我们生成各种查询条件。以下是一些常用的方法及其应用示例。
QUser user = QUser.user;
BooleanExpression eqExample = user.name.eq("Alice");
// 生成条件:name = 'Alice'
BooleanExpression neExample = user.name.ne("Bob");
// 生成条件:name != 'Bob'
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
BooleanExpression inExample = user.name.in(names);
// 生成条件:name IN ('Alice', 'Bob', 'Charlie')
BooleanExpression notInExample = user.name.notIn(names);
// 生成条件:name NOT IN ('Alice', 'Bob', 'Charlie')
BooleanExpression isNullExample = user.email.isNull();
// 生成条件:email IS NULL
BooleanExpression isNotNullExample = user.email.isNotNull();
// 生成条件:email IS NOT NULL
BooleanExpression ltExample = user.age.lt(30);
// 生成条件:age < 30
BooleanExpression loeExample = user.age.loe(30);
// 生成条件:age <= 30
BooleanExpression gtExample = user.age.gt(18);
// 生成条件:age > 18
BooleanExpression goeExample = user.age.goe(18);
// 生成条件:age >= 18
BooleanExpression betweenExample = user.age.between(18, 30);
// 生成条件:age BETWEEN 18 AND 30
BooleanExpression likeExample = user.name.like("A%");
// 生成条件:name LIKE 'A%'
Expression<String> aliasExample = user.name.as("username");
// 为查询结果指定别名
NumberExpression<Long> countExample = user.id.count();
// 生成条件:COUNT(id)
NumberExpression<Long> countDistinctExample = user.id.countDistinct();
// 生成条件:COUNT(DISTINCT id)
NumberExpression<Integer> sumExample = user.age.sum();
// 生成条件:SUM(age)
NumberExpression<Double> avgExample = user.age.avg();
// 生成条件:AVG(age)
NumberExpression<Integer> minExample = user.age.min();
// 生成条件:MIN(age)
NumberExpression<Integer> maxExample = user.age.max();
// 生成条件:MAX(age)
QUser user = QUser.user;
// 创建一个布尔表达式,用于查找年龄在 20 到 30 岁之间,并且邮箱域为 "@example.com" 的用户
BooleanExpression predicate = user.age.between(20, 30)
.and(user.email.like("%@example.com"));
// 使用 QueryDSL 查询工厂,从用户表中选择符合条件的用户
List<User> users = queryFactory.selectFrom(user)
.where(predicate) // 应用布尔表达式作为查询条件
.fetch(); // 执行查询并获取结果列表
QUser user = QUser.user;
// 使用 QueryDSL 查询工厂,选择用户表中的用户 ID 计数
long count = queryFactory.select(user.id.count())
.from(user) // 指定查询的表
.where(user.city.eq("New York").and(user.age.gt(25))) // 条件:城市为 "New York" 且年龄大于 25 岁
.fetchOne(); // 执行查询并获取单个结果(用户数量)
QUser user = QUser.user;
// 使用 QueryDSL 查询工厂,选择每个城市的平均年龄
List<Tuple> result = queryFactory.select(user.city, user.age.avg().as("averageAge"))
.from(user) // 指定查询的表
.groupBy(user.city) // 按城市分组
.orderBy(user.age.avg().desc()) // 按平均年龄降序排序
.fetch(); // 执行查询并获取结果列表
// 遍历查询结果并输出每个城市的平均年龄
for (Tuple tuple : result) {
String city = tuple.get(user.city); // 获取城市名称
Double averageAge = tuple.get("averageAge", Double.class); // 获取平均年龄
System.out.println(city + ": " + averageAge); // 打印城市名称和平均年龄
}
通过使用 QueryDSL 提供的这些方法,我们可以轻松构建复杂的查询条件,避免传统字符串拼接方式带来的错误风险。QueryDSL 不仅提高了代码的可读性和维护性,还增强了查询的安全性。如果你还没有尝试过 QueryDSL,现在是时候开始探索这种强大的工具了。通过熟练掌握这些方法,你可以编写出更高效、健壮的数据库查询代码。