书中用例 "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 Bid
s 但只填充数量大于 20.
的 Bid
s
考虑以下 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 允许这个查询会发生什么)
休眠允许它发生的主要问题:
- 第一个问题这在概念上是错误的,因为任何使用从存储库 return 编辑的 item1 java 对象的服务都不知道 item.getBids 只包含金额 > 20 的出价
- Hibernate 只保留一个对象引用来表示会话中的数据库实体(可重复读取保证、脏检查等)。因此,如果您执行另一个
Select i from Item i where i.itemId = 1
,hibernate 会出现问题,因为现在它必须有两个 java 对象来表示该会话中的项目 1(一个出价金额 > 20,另一个出价全部为项目 1)
希望这能清楚地解释为什么不允许查询
我正在阅读“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 Bid
s 但只填充数量大于 20.
Bid
s
考虑以下 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 允许这个查询会发生什么)
休眠允许它发生的主要问题:
- 第一个问题这在概念上是错误的,因为任何使用从存储库 return 编辑的 item1 java 对象的服务都不知道 item.getBids 只包含金额 > 20 的出价
- Hibernate 只保留一个对象引用来表示会话中的数据库实体(可重复读取保证、脏检查等)。因此,如果您执行另一个
Select i from Item i where i.itemId = 1
,hibernate 会出现问题,因为现在它必须有两个 java 对象来表示该会话中的项目 1(一个出价金额 > 20,另一个出价全部为项目 1)
希望这能清楚地解释为什么不允许查询