2014-02-17 3 views
10

스프링 데이터 jpa 및 querydsl (3.2.3)을 사용하고 있습니다.
사용자 필러/입력을 기반으로하는 조건부 집합을 만드는 시나리오가 있습니다. 이 모든 것은 BooleanExpression입니다. 내가 가져옵니다 형식처럼 CollectionExpression에서 하위 쿼리 할 필요가 그래서 기본적으로QueryDsl - 컬렉션 표현식의 하위 쿼리

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

:

이제
@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 
} 

가, 내가 무엇을 고민하고있어이 쿼리입니다 : 다음과 같은

내 단순화 된 모델 본다 모든 회사는 번호를 입력하고 in() 표현식으로 설정합니다.

내 스프링 데이터 저장소는 CustomQueryDslJpaRepository을 구현하고 JpaRepositoryQueryDslPredicateExecutor까지 확장합니다.
나는 이것에 대한 답이 간단하기를 희망하지만, 나는 querydsl에 대해 아주 새롭고 지금까지 해결책을 찾지 못했다.

답변

24

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

원래의 대답에이 병합 자유롭게 더 JPAesque 형태로 jaiwo99의 대답의 변형이다.

+1

QueryASL 4에서 'JPASubQuery'와 같은 기능을 사용할 수 없습니다.이 답변을 다음 언어로 변환했습니다 :'BooleanExpression exp = invoice.supplier.number.in (JPAExpressions.(회사) .where (company.active.isTrue()) .select (company.nu mber)), ' –

+0

@OliverHernandez 다 대일 관계에서도 같은 결과를 얻으려면 어떻게해야합니까? 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

저는 스프링 데이터 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