2014-07-15 13 views
32

ich folgende HQL Abfrage versuchenorg.hibernate.QueryException: illegaler Versuch zu dereferenzieren Sammlung

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

auszuführen Aber es zeigt

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

Können Sie die Definitionen Ihrer Klassen hinzufügen? Beinhalten sie Beziehungsdefinitionen in ihnen? –

Antwort

75

billProductSet ein Collection ist. Als solches hat es kein Attribut mit dem Namen product.

Product ist ein Attribut der Elemente dieser Collection.

Sie das Thema durch Beitritt die Sammlung statt dereferencing beheben kann:

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

Es funktioniert nicht in meinen Tests, wenn billProductSet @JoinTable und die Beziehung ManyToMany ist. – Stony

+0

@Stony It ** funktioniert ** mit '@ JoinTable' und' @ ManyToMany'. Ich laufe gerade. –

0

weil billProduct ist eine zu viele Mapping und es gibt viele billProduct Einheit von einer BillDetails Einheit kann man nicht Dereferenzieren Sie es in Abfrage.Sie müssen BillDetails-Modell BillProduct beitreten und Ergebnis mit wo Cluase filtern.