【问题标题】:Blaze Persistence & querydsl join subquery with CTE projectionsBlaze Persistence & querydsl 使用 CTE 预测加入子查询
【发布时间】: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


【解决方案1】:

您的语法几乎是正确的,但是 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())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-03
    • 2021-11-14
    • 2017-04-08
    • 2011-10-20
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多