org.hibernate.QueryException:非法尝试取消引用集合
Posted
技术标签:
【中文标题】org.hibernate.QueryException:非法尝试取消引用集合【英文标题】:org.hibernate.QueryException: illegal attempt to dereference collection 【发布时间】:2014-09-05 05:00:53 【问题描述】:我正在尝试按照 hql 查询来执行
SELECT count(*)
FROM BillDetails as bd
WHERE bd.billProductSet.product.id = 1002
AND bd.client.id = 1
但它正在显示
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)
【问题讨论】:
你能添加你的类的定义吗?它们是否包含关系定义? 【参考方案1】:billProductSet
是Collection
。
因此,它没有名为product
的属性。
Product
是这个Collection
的元素的属性。
您可以通过加入集合而不是取消引用来解决此问题:
SELECT count(*)
FROM BillDetails bd
JOIN bd.billProductSet bps
WHERE bd.client.id = 1
AND bps.product.id = 1002
【讨论】:
在我的测试中不起作用,如果billProductSet是@JoinTable,并且关系是ManyToMany。 @Stony 它确实适用于@JoinTable
和@ManyToMany
。我现在正在运行。
仅供参考:在我的情况下,我已经在进行集合的连接,但如果不给它一个别名,它将无法工作。谢谢!【参考方案2】:
因为 billProduct 是一对多映射,并且一个 BillDetails 实体中有多个 billProduct 实体,您无法在查询中取消引用它。您必须将 BillDetails 模型加入 billProduct 并使用 where cluase 过滤结果。
【讨论】:
以上是关于org.hibernate.QueryException:非法尝试取消引用集合的主要内容,如果未能解决你的问题,请参考以下文章