【发布时间】:2023-01-30 20:29:32
【问题描述】:
在 Blaze Persistence with querydsl integration 中,它支持 join 语句中的子查询。所以我想知道如何在连接子查询条件下将项目与 CTE 实体结合起来。
假设我有两个名为人和宠物的实体。它们被定义为:
| Person | Pet |
|---|---|
| id | id |
| name | personId |
| age |
这是我的测试代码:
blazeJPAQueryFactory.selectFrom(QPerson.person)
.leftJoin(
JPQLNextExpressions
.select(Projections.bean(
PersonPetCte.class,
QPet.pet.personId.as(QPersonPetCte.personPetCte.personId),
QPet.pet.age.sum().as(QPersonPetCte.personPetCte.ageSum)
))
.from(QPet.pet)
.groupBy(QPet.pet.personId),
QPersonPetCte.personPetCte
)
.on(QPersonPetCte.personPetCte.personId.eq(QPerson.person.id))
.where(QPersonPetCte.personPetCte.ageSum.gt(30))
.fetch();
其中 PersonPetCte 声明如下(为简洁起见省略了 getter 和 stter):
@CTE
@Entity
public class PersonPetCte {
@Id
Long personId;
Long ageSum;
}
在以下异常中运行此测试结果: java.lang.UnsupportedOperationException:选择语句应该绑定到任何 CTE 属性
基本上我想实现这个:让所有宠物年龄总和超过 30 岁的人。
我试图尽可能避免字符串硬编码常量,这就是我想到使用 CTE 的原因。
如果我在概念上完全错误或遗漏了什么,请告诉我。
【问题讨论】:
-
为什么不使用 JPQL/Criteria API?
select p from Person p where (select sum(pp.age) from Pet pp where pp.personId = p.id) > 30 -
@AndreyB.Panfilov 谢谢你的建议。但我正在寻找一个单独使用 Blaze + QueryDsl 或 QueryDsl 的解决方案,因为在实际情况下,我有一个完全基于 QueryDsl 构建的项目,具有复杂的查询。切换到 Criteria API 意味着完全重写。
标签: java hibernate jpa querydsl blaze-persistence