本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
使用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