2015-01-14 5 views
0

그래서, 나는 다음과 같은 기관이 있습니다기준 쿼리

@Entity 
public class Supplier { 
    @Column(name = "SUPPLIERID") 
    private BigInteger supplierId; 

    @OneToMany 
    @JoinColumn(name = "ID_SUPP", foreignKey = @ForeignKey(name = "fk_POIS_SUPP")) 
    private List<POS> posList; 

    ... 
} 

@Entity 
public class POS { 
    @Column(name = "POSID") 
    private BigInteger posId 
} 

그래서, POS 우리가 단방향 한 대를 가지고 있다는 것을 의미 Supplier에 대한 참조를 가지고하지 않습니다 많은 관계. POSposIdsupplierId으로 찾아야합니다. 즉, 지정된 supplierId의 공급 업체를 찾은 다음 공급 업체의 pos 목록에서 지정한 posId가있는 POS를 찾으십시오. 이를위한 기준 쿼리는 어떻게 작성합니까?

하위 쿼리를 사용해 보았습니다. 내 생각은 모든 POSSupplier을 주어진 supplierId으로 가져 오는 하위 쿼리를 만드는 것이 었습니다. 그런 다음 기본 쿼리는 해당 POS에서 POS에 대해 지정된 posId을 검색합니다.

POSSupplier 목록을 가져 오는 쿼리를 작성할 수 없습니다. 분명히 당신은 유형 List<POS>의 쿼리를 쓸 수 없습니다 :

CriteriaBuilder cb = entityManager.getCriteriaBuilder(); 
CriteriaQuery<POS> outerQuery = cb.createQuery(POS.class); 
Root<POS> outerQueryRoot = outerQuery.from(POS.class); 

Subquery<POS> subquery = outerQuery.subquery(POS.class); 
Root<Supplier> subqueryRoot = subquery.from(Supplier.class); 
subquery.where(cb.equal(subqueryRoot.get(Supplier_.supplierId), supplierId)); 
subquery.select(subqueryRoot.get(Supplier_.posList); 

이 마지막 줄에를, 내가 컴파일 오류 Expression<POS> does not match Expression<List<POS>> 것을 얻는다. 그리고 Java가 일반 클래스 리터럴 (List<POS>.class)을 허용하지 않기 때문에 서브 쿼리의 유형을 변경할 수 없습니다.

아이디어가 있으십니까?

답변

2

I을 참조하십시오 JPQL에 SQL 상당 "(공급 업체 ID 곳 s.id = s.posList 특검팀에 가입 공급 업체들로부터 sp.id를 선택) 여기서 p.id에서 POS의 페이지에서 페이지를 선택" 대답을 찾았으니 두 개만 사용하십시오. roots :

CriteriaBuilder cb = entityManager.getCriteriaBuilder(); 
    CriteriaQuery<POS> cq = cb.createQuery(POS.class); 

    Root<POS> posRoot = cq.from(POS.class); 
    Root<Supplier> supplierRoot = cq.from(Supplier.class); 

    cq.where(cb.and(
        cb.equal(supplierRoot.get(Supplier_.suppliertId), supplierId), 
        cb.equal(posRoot.get(POS_.posId), posId))); 
    cq.select(posRoot); 
0

하위 쿼리를 사용하여이 작업을 수행 할 수 있습니다.

마지막 JPA2 Criteria-API: select... in (select from where)

+0

기준 쿼리에 대한 경험이 없기 때문에 테스트가되지 않았습니다. 아마도 주제에 더 정통한 사람이 도움이 될 것입니다. –

+0

링크를 따라 왔습니까? 예를 들어 있습니다. – carbontax

+0

나는이 링크를 읽었다. 하지만 하위 쿼리를 작성할 수 없으므로 컴파일되지 않습니다. 나는 그 질문 자체에 대해 자세히 설명 할 것이다. –