繁体   English   中英

Blaze Persistence & querydsl 使用 CTE 预测加入子查询

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM