2014-07-15 5 views
32

불법 시도가 나는org.hibernate.QueryException : 역 참조 수집

SELECT count(*) 
    FROM BillDetails as bd 
WHERE bd.billProductSet.product.id = 1002 
    AND bd.client.id     = 1 

을 실행하기 위해 다음과 같은 HQL 질의를하려하지만

org.hibernate.QueryException: illegal attempt to dereference collection 
[billdetail0_.bill_no.billProductSet] with element property reference [product] 
[select count(*) from iland.hbm.BillDetails as bd where bd.billProductSet.product.id=1001 and bd.client.id=1] 
    at org.hibernate.hql.ast.tree.DotNode$1.buildIllegalCollectionDereferenceException(DotNode.java:68) 
    at org.hibernate.hql.ast.tree.DotNode.checkLhsIsNotCollection(DotNode.java:558) 
+0

클래스 정의를 추가 할 수 있습니까? 관계 정의가 포함되어 있습니까? –

답변

75

billProductSetCollection입니다 보이고있다. 따라서 product이라는 속성이 없습니다.

Product은의 이며이 Collection입니다.

당신은 에 의해 문제가 컬렉션 에 합류하는 대신를 역 참조 해결할 수

그것은 : billProduct 많은 매핑에 하나이며, 당신이 할 수없는 일 BillDetails 엔티티 많은 billProduct 엔티티가

SELECT count(*) 
    FROM BillDetails  bd 
    JOIN bd.billProductSet bps 
WHERE bd.client.id  = 1 
    AND bps.product.id  = 1002 
+0

billProductSet이 @JoinTable이고 ManyToMany 인 경우 내 테스트에서 작동하지 않습니다. – Stony

+0

@Stony ** ** @ JoinTable 및 @ ManyToMany와 함께 ** 작동합니다. 나는 지금 그걸 달리고있다. –

0

때문에 쿼리에서 참조를 취소하십시오. billProperties에 BillDetails 모델을 결합하고 결과를 필터 위치로 필터링해야합니다.