QueryDSL 记录(持续更新) 您所在的位置:网站首页 querydsl官方文档 QueryDSL 记录(持续更新)

QueryDSL 记录(持续更新)

2023-09-20 17:04| 来源: 网络整理| 查看: 265

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

使用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 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


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有