【问题标题】:HQL and one-to-many queriesHQL 和一对多查询
【发布时间】:2010-11-13 03:35:21
【问题描述】:

我有如下所示的 Hibernate 域对象:

   class Player {
      List<Item> inventory;
   }

   class Item {
      List<Enchantment> enchantments;
   }

   class Enchantment {
      boolean isSuperiorEnchantment;
   }

我需要构建一个 HQL 查询,该查询返回给我的所有玩家的列表,这些玩家至少拥有一件带有附魔的物品,并且设置了 isSuperiorEnchantment 标志。我一辈子都想不出用 HQL 表达这一点的方法。

有什么想法吗?

【问题讨论】:

    标签: hibernate hql


    【解决方案1】:

    假设以上所有内容都有适当的映射,您要查找的查询是:

    select p
    from Player as p
      left join p.inventory as i
      left join i.enchantments as e
    where e.isSuperiorEnchantment = 1
    

    【讨论】:

    • 谢谢,效果很好。我必须记得在它的前面添加一个“select p”,否则这正是我需要的!
    • 我只是在学习 HQL,但在常规 SQL 中这是行不通的——左连接意味着即使 Inventory 和 Enchantments 中没有匹配的记录,您也会获得 Player 结果。 (我会继续挖掘以澄清这一点......我怀疑“左连接”在 HQL 中意味着不同的东西,或者这个查询不会有太大用处)。
    • @RobWhelan 由于e.isSuperiorEnchantment = 1 条件对于没有附魔的玩家不会满足,因为isSuperiorEnchantment 将无法满足上述查询(当然,对语法进行适当调整)在常规 SQL 中工作得很好以 null 形式返回。
    • @ChssPly76 啊,你说得对——我把它读作“on”子句而不是常规的“where”。尽管构造查询仍然是一种奇怪的方式——通常您只需使用普通的旧内部连接,并且查询优化器可能会在点击过滤器之前忽略所有缺少 Inventory 或 Enchantments 的 Player 行。
    猜你喜欢
    • 2018-01-26
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 2017-12-24
    相关资源
    最近更新 更多