[英]Blaze Persistence & querydsl join subquery with CTE projections
在 Blaze Persistence with querydsl integration 中,它支持 join 语句中的子查询。 所以我想知道如何在连接子查询条件下将项目与 CTE 实体结合起来。
假设我有两个名为人和宠物的实体。 它们被定义为:
人 | 宠物 |
---|---|
ID | ID |
名称 | 人员编号 |
年龄 |
这是我的测试代码:
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: Select statement should be bind to any CTE attribute
基本上我想实现这个:让所有宠物年龄总和超过 30 岁的人。
我试图尽可能避免字符串硬编码常量,这就是我想到使用 CTE 的原因。
如果我在概念上完全错误或遗漏了某些东西,请告诉我。
您的语法几乎是正确的,但是Projections.bean
没有提供足够的元数据来推断 CTE 的映射。
相反,你必须这样做:
new BlazeJPAQuery<>()
.from(QPet.pet)
.groupBy(QPet.pet.personId)
.bind(QPersonPetCte.personPetCte.personId, QPet.pet.personId)
.bind(QPersonPetCte.personPetCte.ageSum, QPet.pet.age.sum())
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.