【问题标题】:HQL: illegal attempt to dereference collectionHQL:非法尝试取消引用集合
【发布时间】:2011-09-18 07:05:20
【问题描述】:

情况是这样的:

我有一个实体 Book 与 Chapter 保持一对多关系。

现在,如果我尝试查询“from Book book inner join book.chapters chapter where chapter.title like '%hibernate%'”,它会给我想要的结果。

但如果我尝试“from Book where book.chapters.title like '%hibernate%'”,我会收到错误非法尝试取消引用集合

问题是我只想要 Book 对象的集合作为回报,而不是我通过前一个查询获得的一对 Book 和 Chapter 对象的集合。

有人可以帮我理解吗?

【问题讨论】:

    标签: hibernate hql


    【解决方案1】:

    chapters 是书籍中的集合,因此不会包含属性标题 (Collection.title)。您需要加入章节才能将它们包含在您的查询中,就像您的第一个示例一样。如果你的章节被懒惰地映射,你只会得到一个书籍的集合,而没有加载其中的章节。所以我想说,使用你的第一个查询。

    如需进一步阅读,请查看query HQL joinsperformance fetching 页面。

    【讨论】:

    • 即使章节实体被延迟映射,为什么它只会得到我之前查询的书籍集合?我认为select book from Book book inner join book.chapters chapter where chapter.title like '%hibernate%' 是我应该首先尝试的。非常感谢您的回复:)
    • 我在我的答案中添加了两个链接,概述了获取策略。
    • 感谢您的链接,但即使我使用 LAZY 进行获取策略,我也会在结果中获得书籍和章节对。我得到了重复的书籍对象。不过感谢您的链接:)
    【解决方案2】:

    您可以使用子查询来做到这一点。

    类似

    from Book book where not exists (from chapter where 
                       chapter.title like '%hibernate%' and chapter.book = book)
    

    (未测试...)

    【讨论】:

    • 是的,这可能没问题。出于某种原因,我认为您提供的数据比您想要的要多。
    • select book from Book book inner join book.chapters chapter where chapter.title like '%hibernate%' 对我来说工作得很好。非常感谢您的回复:)
    • 对不起,我上次评论中的错字,它应该是标题和休眠。是的,我只需要删除重复的对象,并且我想在从查询中检索到的书籍集合上使用 LinkedHashSet 之类的东西。谢谢:)
    • 我认为,book.chapters.title 不再受支持,仅适用于旧版本的休眠。不过我不确定这个事实。
    猜你喜欢
    • 2023-04-09
    • 2012-10-17
    • 2014-09-05
    • 1970-01-01
    • 2015-11-27
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多