그래서, 나는 다음과 같은 기관이 있습니다기준 쿼리
@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
에 대한 참조를 가지고하지 않습니다 많은 관계. POS
을 posId
및 supplierId
으로 찾아야합니다. 즉, 지정된 supplierId
의 공급 업체를 찾은 다음 공급 업체의 pos 목록에서 지정한 posId가있는 POS를 찾으십시오. 이를위한 기준 쿼리는 어떻게 작성합니까?
하위 쿼리를 사용해 보았습니다. 내 생각은 모든 POS
의 Supplier
을 주어진 supplierId
으로 가져 오는 하위 쿼리를 만드는 것이 었습니다. 그런 다음 기본 쿼리는 해당 POS
에서 POS
에 대해 지정된 posId
을 검색합니다.
POS
의 Supplier
목록을 가져 오는 쿼리를 작성할 수 없습니다. 분명히 당신은 유형 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
)을 허용하지 않기 때문에 서브 쿼리의 유형을 변경할 수 없습니다.
아이디어가 있으십니까?
기준 쿼리에 대한 경험이 없기 때문에 테스트가되지 않았습니다. 아마도 주제에 더 정통한 사람이 도움이 될 것입니다. –
링크를 따라 왔습니까? 예를 들어 있습니다. – carbontax
나는이 링크를 읽었다. 하지만 하위 쿼리를 작성할 수 없으므로 컴파일되지 않습니다. 나는 그 질문 자체에 대해 자세히 설명 할 것이다. –