书中用例 "Java Persistence with Hibernate, 2nd Edition"

use case in the book "Java Persistence with Hibernate, 2nd Edition"

我正在阅读“Java Hibernate 的持久性,第 2 版”一书。它以出售给像易趣这样的投标人的物品为例。在第 400 页,作者说

The query select i from item i left join fetch i.bids b where b.amount > 20 is invalid. You can’t say, “Load the Item instances and initialize their bids collections, but only with Bid instances that have a certain amount.”

我不太清楚。在我看来它是有效的,但它只会呈现出价大于 20 的项目。在这种情况下,它将呈现具有该条件的内部连接

另外下面的请求select i from item i left join fetch i.bids b on b.amount > 20有效吗?

select i from item i left join fetch i.bids b where b.amount > 20 因为 HQL 无效。因为 HQL 结果用于 return Item 对象,所以你不能告诉 hibernate 请创建 Item 对象但是当你创建它时,不要用 all Bids 但只填充数量大于 20.

Bids

考虑以下 class

public class Item {
    String name;
    Collection<Bid> bids;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Collection<Bid> getBids() {
        return bids;
    }

    public void setBids(Collection<Bid> bids) {
        this.bids = bids;
    }
}

更新:(让 运行 通过一个例子看看如果 hibernate 允许这个查询会发生什么)

休眠允许它发生的主要问题:

  1. 第一个问题这在概念上是错误的,因为任何使用从存储库 return 编辑的 item1 java 对象的服务都不知道 item.getBids 只包含金额 > 20 的出价
  2. Hibernate 只保留一个对象引用来表示会话中的数据库实体(可重复读取保证、脏检查等)。因此,如果您执行另一个 Select i from Item i where i.itemId = 1 ,hibernate 会出现问题,因为现在它必须有两个 java 对象来表示该会话中的项目 1(一个出价金额 > 20,另一个出价全部为项目 1)

希望这能清楚地解释为什么不允许查询