2014-07-15 22 views
32

sto cercando seguente query HQL per eseguireorg.hibernate.QueryException: tentativo illegale di raccolta dereferenziare

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

Ma sta mostrando

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

Puoi aggiungere le definizioni delle tue classi? Contengono le definizioni delle relazioni in loro? –

risposta

75

billProductSet è un Collection. Come tale, non ha un attributo denominato product.

Product è un attributo degli elementi di questo Collection.

È possibile risolvere il problema da unendo la raccolta invece di dereferenziazione esso:

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

Non funziona nei miei test, se billProductSet è @JoinTable e la relazione è ManyToMany. – Stony

+0

@Stony It ** fa ** funziona con '@ JoinTable' e' @ ManyToMany'. Ce l'ho proprio in questo momento. –

0

perché billProduct è uno a molti mappatura e ci sono molte entità billProduct da un'entità BillDetails non si può dereferenziarlo in query.è necessario unire il modello BillDetails a billProduct e filtrare i risultati con where cluase.