当前位置: 首页 > 知识库问答 >
问题:

在子查询中使用父查询entitypath来querydsl

沈琨
2023-03-14
select a1.agreement_id, ad1.agreement_detail_id
from agreement a1
  inner join agreement_details ad1 on a1.agreement_id=ad1.agreement_id 
where ad1.transaction_id in (
  select max(ad2.transaction_id) 
  from agreement_details ad2 
    inner join agreement a2 on ad2.agreement_id=a2.agreement_id 
  where 
    ad2.transaction_id<=1234
    and a2.agreement_id=a1.agreement_id 
    and a2.entity_split_id=5678 
) 
order by a1.agreement_id asc
QAgreement a1 = QAgreement.agreement;
QAgreementDetails ad1 = QAgreementDetails.agreementDetails;
QAgreement a2 = QAgreement.agreement;
QAgreementDetails ad2 = QAgreementDetails.agreementDetails;
HibernateQuery query = getHibernateQuery();
query.from(a1)
    .innerJoin(a1.agreementDetailsesByAgreementId, ad1)
    .fetch()
    .where(ad1.transactionId.in(
      new JPASubQuery().from(ad2)
        .innerJoin(ad2.agreementByAgreementId, a2)
        .where(ad2.transactionId.loe(maxTransactionId))
        .where(a1.agreementId.eq(a2.agreementId))
        .where(a2.entitySplitByEntitySplitId.entitySplitId.eq(entitySplitId))
        .list(ad2.transactionId.max())))
        .orderBy(a1.agreementId.asc());
select  -- Some columns removed for brevity
   agreement0_.agreement_id as agreemen1_0_0_,
   agreementd1_.agreement_detail_id as agreemen1_11_1_ 
from
   agreement agreement0_ 
inner join
   agreement_details agreementd1_ 
       on agreement0_.agreement_id=agreementd1_.agreement_id 
where
   agreementd1_.transaction_id in (
       select
           max(agreementd2_.transaction_id) 
       from
           agreement_details agreementd2_ 
       inner join
           agreement agreement3_ 
               on agreementd2_.agreement_id=agreement3_.agreement_id 
       where
           agreementd2_.transaction_id<=1234
           and agreement3_.agreement_id=agreement3_.agreement_id 
           and agreement3_.entity_split_id=5678 
   ) 
order by
   agreement0_.agreement_id asc

您可以看到,子查询中没有使用协议实体路径a1的别名,而是被协议实体路径A2的别名所取代。在querydsl中还需要做一些其他的事情才能生成这个查询吗?

共有1个答案

莫翰藻
2023-03-14

问题是您没有使用唯一变量

QAgreement a1 = QAgreement.agreement;
QAgreementDetails ad1 = QAgreementDetails.agreementDetails;
QAgreement a2 = QAgreement.agreement;
QAgreementDetails ad2 = QAgreementDetails.agreementDetails;

在这种情况下,a1和a2以及ad1和ad2指的是同一路径。

Java代码中的变量名并不重要,您需要使用它们,例如如下所示

QAgreement a1 = new QAgreement("a1");
QAgreementDetails ad1 = new QAgreementDetails("ad1");
QAgreement a2 = new QAgreement("a2");
QAgreementDetails ad2 = new QAgreementDetails("ad2");
 类似资料:
  • 问题内容: 我有以下查询,该查询通常可以正常工作,并且应该返回涵盖定义时间范围的所有行(如果没有绝对匹配,则采用最接近的前一行和后一行-在http://www.orafaq.com/node/1834中概述) 但是希望通过引用外部选择来减少两个表的子选择,但是显然它不喜欢它 有没有一种方法可以使查询不选择三个表? 问题答案: 您可以通过联接执行以下操作: 我不是MySQL专家,因此如果需要一些语法

  • 关于子查询使用 利用子查询进行过滤 列出够物品RGAN01的所有客户。 检索包含物品RGAN01的所有订单编号。 检索具有前一步骤列出的订单编号所有客户ID。 检索前一步骤返回的所有客户ID的客户信息。 mysql> SELECT order_num -> FROM OrderItems -> WHERE prod_id = 'RGAN01'; +-----------+ | or

  • 问题内容: 有没有办法从mySQL的子查询中指定父查询字段? 例如: 我已经用PHP编写了一个基本的公告板类型程序。 在数据库中,每个帖子都包含:id(PK)和parent_id(父帖子的ID)。如果帖子本身是父项,则其parent_id设置为0。 我正在尝试编写一个mySQL查询,该查询将查找每个父级帖子以及父级拥有的子级数。 棘手的是,第一个 ID 不知道它应该引用子查询之外的第二个 ID 。

  • 问题内容: 这对我来说是一个常见的SQL查询: 有什么办法可以避免拥有两个几乎相同的子查询?该查询是一个明显的简化,但是性能会受到影响,并且查询的内容不必要地凌乱。 问题答案: 不幸的是,Informix不支持UPDATE语句中的FROM子句。解决方法,您将获得更好的结果(性能),方法是将UPDATE更改为MERGE语句。 仅当您的数据库为11.50或更高版本时,此方法才有效 查看IBM Info

  • 问题内容: 是否可以在使用MySQL的子查询中引用外部查询?我知道在 某些 情况下这是可能的: 但是我想知道这样的事情是否可以工作: 我知道我可以使用或通过将外部子句拉入子查询来实现相同目的,但是我需要这样做来自动生成SQL,并且由于各种其他原因,不能使用任何一种替代方法。 更新 :对不起,这个问题引起了一些混乱:第一个查询只是一个可行的示例,以演示我 不需要的 东西。 更新2 :我需要两个u.i

  • 问题内容: 我有这个架构 样本数据 SQL Fiddle演示。我已经插入了一些示例数据。 查兰芝 我需要找到唱片标题的所有父母。如何仅通过一个查询就可以获取所有父母? 我的意思是我需要这个结果: 期望的输出 假设我想使用其所有父项来获取条目,并且要使用where条件,那么它应该获取上述记录。 问题答案: 演示版