【问题标题】:QueryDsl - subquery in collection expressionQueryDsl - 集合表达式中的子查询
【发布时间】:2014-03-16 14:42:30
【问题描述】:

我正在使用 spring-data-jpa 和 querydsl (3.2.3)
我有一个场景,我正在根据用户文件管理器/输入创建一组谓词。所有这些都来自BooleanExpression

我的简化模型如下所示:

@Entity
public class Invoice {
    @ManyToOne
    private Supplier supplier;
}

@Entity
public class Supplier {
    private String number;
}

@Entity
public class Company {
    private String number;
    private boolean active
}

现在,我正在努力解决这个问题:

SELECT * FROM Invoice WHERE invoice.supplier.number in (SELECT number from Company where active=true)

所以基本上我需要以CollectionExpression 之类的格式进行子查询,该格式将获取所有公司编号并将其设置为 in() 表达式。

我的 spring-data 存储库实现了 CustomQueryDslJpaRepository,它又扩展了 JpaRepositoryQueryDslPredicateExecutor
我希望这个问题的答案是直截了当的,但我对 querydsl 很陌生,到目前为止还没有找到解决方案。

【问题讨论】:

    标签: java spring spring-data querydsl


    【解决方案1】:

    这里是 jaiwo99 的答案的变体,更 JPAesque 形式

    BooleanExpression exp = invoice.supplier.number.in(new JPASubQuery()
        .from(company)
        .where(company.active.isTrue())
        .list(company.nu‌​mber));
    

    请随意将其合并到原始答案中。

    【讨论】:

    • 似乎 JPASubQuery 在 QueryDSL 4 中不再可用。将此答案转换为:BooleanExpression exp = invoice.supplier.number.in(JPAExpressions.selectFrom(company) .where(company.active.isTrue()) .select(company.nu‌​mber));
    • @OliverHernandez 如何实现多对多关系的相同? stackoverflow.com/questions/44830387/…
    【解决方案2】:

    试试这个:

    QInvoice invoice = QInvoice.invoice;
    QCompany company = QCompany.company;
    
    List<Invoice> list = new HibernateQuery(sessionFactory.getCurrentSession())
          .from(invoice).where(
          new HibernateSubQuery().from(invoice, company).where(
                  invoice.supplier.number.eq(company.number).and(
                  company.active.eq(true))).exists()).list(invoice);
    

    【讨论】:

    • 问题是我正在使用 spring-data-jpa 和 querydsl 的组合。我需要构造一个 querydls 谓词(可以进一步与其他谓词组合以缩小搜索结果)。我需要获取所有活跃的公司号码并将其用作第一个查询中的 IN() 子句。我正在尝试这样,但没有成功:BooleanExpression exp = invoice.supplier.number.in( company.active.eq(true) )
    • @wiecia 如果您使用的是in(),请确保您有一个集合作为参数,显然company.active.eq(true) 并不表示集合
    • @wiecia 我将更新上面的查询以满足您的需要
    • 是的,这只是复制粘贴错误,谢谢,有没有办法以谓词/表达式的方式表达这一点?我的意思是在我创建这个谓词的类中,我无权访问 HB session/EM(并且不想拥有)它应该是一些通用的 subqery。
    • 我的情况是我正在创建一个谓词列表:List&lt;BooleanExpression&gt; predicates = Lists.newArrayList();,最后我将它放在一起构建最终的搜索查询:return BooleanExpression.allOf(predicates.toArray(new BooleanExpression[predicates.size()])); 这样我就可以收集所有用户输入并构造最终查询,因此我正在寻找一种方法来构造该 IN() 子查询,而无需注入 HB 会话或 jpa EM
    猜你喜欢
    • 2016-08-07
    • 2015-06-21
    • 1970-01-01
    • 2014-08-01
    • 2016-05-12
    • 2013-05-03
    • 1970-01-01
    • 2016-04-23
    • 2013-09-12
    相关资源
    最近更新 更多