2014-02-17 27 views
10

我正在使用spring-data-jpa和querydsl(3.2.3)
我有一个场景,我正在根据用户filer/input创建一组谓词。所有这些来到BooleanExpressionQueryDsl - 收集表达式中的子查询

我的简化模型看起来如下:

@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()表达式。

我的弹簧数据存储库实现CustomQueryDslJpaRepository,这又扩展了JpaRepositoryQueryDslPredicateExecutor
我希望这个答案很简单,但我对querydsl很陌生,到目前为止找不到解决方案。

回答

24

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

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

随意合并到原始回答这个问题。

+1

似乎在QueryDSL 4中不再提供'JPASubQuery'。将此答案转换为:'BooleanExpression exp = invoice.supplier.number.in(JPAExpressions。select(公司) .where(company.active.isTrue()) .select(company.nu mber));' –

+0

@OliverHernandez如何实现相同的Many to Mant关系? https://stackoverflow.com/questions/44830387/how-to-create-predicate-booleanexpression-for-many-to-many-relations-in-jpa –

1

试试这个:

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); 
+0

事情是我使用spring-data-jpa和querydsl的组合。我需要构造一个querydls谓词(可以与其他谓词进一步组合以缩小搜索结果)。我需要获取所有活动公司数字,并在第一个查询中将其用作IN()子句。我试图这样做,但它没有成功: 'BooleanExpression exp = invoice.supplier.number.in(company.active.eq(true))' – wiecia

+0

@wiecia如果您使用in(),请确保你有一个集合作为参数,显然'company.active.eq(true)'不表示集合 – Jaiwo99

+0

@wiecia我会更新上面的查询以符合你的需要 – Jaiwo99