使用QueryDsl和布尔表达式的联接

问题描述 投票:0回答:1

需要有关使用BooleanExpression的QueryDsl的帮助。在下面找到要求。

  1. 我有查询和跟进表格。它们之间存在一对多映射。 1个跟进的查询。
  2. 假设我有5个查询。对于每个查询,我都会进行3次跟进。
  3. 期望是..i每个询问都需要跟踪的最后记录。

请找到我尝试过的其他方法。

QBuyerFollowUp qBuyerfollowup = QBuyerFollowUp.buyerFollowUp;
ListPath<BuyerFollowUp, QBuyerFollowUp> followUpList = qBuyerEnquiry.followUpList;
  1. BooleanExpression expression = commonExpression.and(new JPAQuery<>().select(qBuyerfollowup.nextDate).from(qBuyerfollowup)
                        .where(qBuyerfollowup.eq(followUpList.any()))
                        .orderBy(qBuyerfollowup.followUpId.desc()).limit(1).eq(new Date());
    

    请忽略另一个表达式commonExpression。

    错误:子查询返回多于1行

  2. BooleanExpression  expression = followUpList.any().followUpId.in(new JPAQuery<QBuyerFollowUp>().select(qBuyerfollowup.followUpId.max())
                        .from(qBuyerfollowup).groupBy(qBuyerfollowup.buyerEnquiry.id)
                        .having(qBuyerfollowup.nextDate.eq(dateFormat.parse(dateFormat.format(new Date())))));
    

    错误:未知列nextDate。

    这里生成的查询是:

    select count(buyerenqui0_.id) as col_0_0_ from buyer_enquiry buyerenqui0_ where 
    buyerenqui0_.assigned_to= 79 and 
    (buyerenqui0_.created_at between "2020-05-01 00:00:00" and "2020-05-31 23:59:59") and buyerenqui0_.enq_status<> "Dropped" and  
    not ( not (exists (select followupli1_.id from buyer_followup followupli1_ where buyerenqui0_.id=followupli1_.buyer_enquiry_id))) 
    and (exists (select 1 from buyer_followup followupli2_ where buyerenqui0_.id=followupli2_.buyer_enquiry_id and 
    (followupli2_.id in (select max(a.id) from buyer_followup a group by a.buyer_enquiry_id having date(a.next_date)=date(now())))));
    

    解决方案:如果将从此查询中删除别名'a'

    select max(a.id) from buyer_followup a group by a.buyer_enquiry_id having date(a.next_date)=date(now())))
    

    工作正常。但是我们对此没有任何控制权,因为别名是由Spring生成的。

spring-boot querydsl boolean-expression
1个回答
0
投票

您无法在JPQL中加入子查询,但可以对其进行投影,在这种情况下,这应该足够了:

QInquiry inquiry = QInquiry.inquiry;
QFollowup followup = QFollowup.followup;

Map<Inquiry, Followup> results = query().from(inquiry)
    .transform(GroupBy.groupBy(inquiry).as(query().from(followup)
        .where(followup.inquiry.eq(inquiry)
        .orderBy(followup.id.desc())
        .limit(1)))
© www.soinside.com 2019 - 2024. All rights reserved.