QueryDsl - 集合表达式中的子查询

wie*_*cia 13 java spring querydsl spring-data

我正在使用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
}
Run Code Online (Sandbox Code Playgroud)

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

SELECT * FROM Invoice WHERE invoice.supplier.number in (SELECT number from Company where active=true)
Run Code Online (Sandbox Code Playgroud)

所以基本上我需要以CollectionExpression类似格式的子查询来获取所有公司的数字并将其设置为in()表达式.

我的spring-data存储库实现CustomQueryDslJpaRepository了反过来扩展JpaRepositoryQueryDslPredicateExecutor.
我希望答案是直截了当的,但我对querydsl很新,到目前为止还没有找到解决方案.

Tim*_*per 28

以下是jaiwo99的更多JPAesque形式的答案

BooleanExpression exp = invoice.supplier.number.in(new JPASubQuery()
    .from(company)
    .where(company.active.isTrue())
    .list(company.nu??mber));
Run Code Online (Sandbox Code Playgroud)

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

  • 看起来像`JPASubQuery`在QueryDSL 4中不再可用.将此答案转换为:`BooleanExpression exp = invoice.supplier.number.in(JPAExpressions.selectFrom(company).where(company.active.isTrue()).select( company.nu MBER));` (14认同)