【问题标题】:Can I eager load a property using HQL?我可以使用 HQL 急切加载属性吗?
【发布时间】:2011-04-10 16:58:45
【问题描述】:

我正在尝试研究如何在以下 HQL 查询中急切加载客户:

select order.Customer
from Order as order
where order.Id in
(
  select itemId
  from BadItem as badItem
  where (badItemType = :itemType) and (badItem.Date >= :yesterday)
)

订单和客户之间通常存在多对一的关系。

如果可能的话,我想在查询中执行此操作,而不是在映射中 - 如在“join fetch...”中

也许查询会被重构为一个连接,我有一个心理障碍。

有什么想法吗?

【问题讨论】:

    标签: nhibernate select hql eager-loading


    【解决方案1】:
    select customer
    from BadItem as badItem
    join fetch badItem.Order as order
    left join fetch order.Customer as customer 
    where (badItemType = :itemType) and (badItem.Date >= :yesterday)
    

    如果 BadItem 与 Order 无关,您需要添加 BadItem 和 Order 之间的关系,或者使用带有额外条件的 inner join (使用备选方案 2 时注意性能)。

    替代方案:

    select customer
    from Order as order
    join fetch order.Customer as customer
    where order.Id in
    (
      select itemId
      from BadItem as badItem
      where (badItemType = :itemType) and (badItem.Date >= :yesterday)
    )
    

    编辑:

    怎么样:

    select customer
    from Order as order
    join fetch order.Customer customer
    join fetch customer.orders 
    where order.Id in
    (
      select itemId
      from BadItem as badItem
      where (badItemType = :itemType) and (badItem.Date >= :yesterday)
    )
    

    【讨论】:

    • 感谢您的帮助。我首先尝试您的“替代”查询,但收到“查询指定连接提取,但提取关联的所有者不在选择列表中”错误。有任何想法吗?一旦我能弄清楚如何映射 BadItem 和 Order,我会尝试你的第一个建议(BadItems 表中的键实际上是三列 - 不是我的设计)。
    • 嗯,听起来原因是如果您选择客户,他们将已经被填充。所以这基本上意味着你的问题没有实际意义;如果直接选择客户,客户不能被延迟加载(hibernate 不支持属性级别的延迟加载),因此已经加载。会是这样吗?
    • 有人会这么认为,但我的原始查询会为 Customer._orders 引发 LazyInitializationException(_orders 是 Order 属性的支持字段)。
    • 是的。现在看起来不错。问题解决了。我想我还有一个令人困惑的问题,但现在都解决了。
    猜你喜欢
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    相关资源
    最近更新 更多