QueryDSL 记录(持续更新)

901 阅读1分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

使用MYSQL系统函数

某次需要使用 find_in_set 作为条件进行查询,但是经过测试报错如下:

QuerySyntaxException: unexpected AST node

解决办法

MYSQL原生sql只需要使用下面的格式即可

select * from table where id find_in_set(1, '1,2,3');

querydsl可以使用其 BooleanTemplate 完成此表达式的构建

但是, JPA就必须使用一下格式

BooleanTemplate booleanTemplate =
    Expressions.booleanTemplate("find_in_set({0}, {1}) > 0", 1, "1,2,3");
// 1,2,3可以更换为数据库字段(querydsl表达式)

区别在哪呢?就是 > 0

子查询结果排序

比如需要根据某汇总数据结果进行倒序

原生sql格式大致如下, 需要根据 t2_count 进行排序

select t.id, 
    (select count(1) from table2 t1 where t1.id = t.t_id) 
        as t2_count 
from table t order by t2_count desc;

解决办法

querydsl中可以使用 StringTemplate 对as别名字段进行排序

//查询列使用
select(Expressions.as(t2Count, "t2_count"))

//排序条件使用
orderBy(new OrderSpecifier(Order.DESC, 
    Expressions.stringTemplate("t2_count")));

ifnull

原生sql中可以使用

select ifnull(sum(count), 0) from table

如果 sum(count) 的结果为null, 则默认使用0代替

在querydsl中语法如下

//就是使用 coalesce(0)
select(QTable.table.count.sum().coalesce(0)).from(QTable.table)

对查询结果某些列进行计算作为条件使用

比如查询学生的考试分数,表中有总分平均分字段,需要找出总分 - 平均分 > 30的记录。

原生sql大致如下

select sum_score, avg_score, student_name from stu_score where sum_score - avg_score > 30

querydsl实现

JPAQuery<Tuple> jpaQuery = select(QStuScore.stuscore.sumScore, QStuScore.stuscore.avgScore).from(QStuScore.stuscore);
//添加条件
jpaQuery.where(Expressions.numberOperation(Integer.class, Ops.SUB,QStuScore.stuscore.sumScore, QStuScore.stuscore.avgScore).gt(30));
//说明
//Expressions.numberOperation(Integer.class, Ops.SUB,QStuScore.stuscore.sumScore, QStuScore.stuscore.avgScore)
//表示创建一个数字操作, 类型为Integer, Ops.SUB表示减操作, 后面两个就是操作的列, gt(30)表示结果需大于30