我还在用旧的
org.hibernate.Criteria
对获取模式越来越困惑。在各种查询中,我需要
以下所有变体
@ManyToOne(fetch=FetchType.LAZY)
,否则,不会更改查询中的任何内容。
到目前为止,我所能找到的要么与HQL或JPA2有关,要么只提供了两种选择,但对于旧的标准和(至少)以下三种情况,我需要它:
-
执行一个JOIN,然后从两个表中提取。这是正常的,除非数据太冗余(例如,主数据很大或在结果中重复多次)。在SQL中,我会写
SELECT * FROM item JOIN order on item.order_id = order.id
WHERE ...;
-
做一个连接,从第一个表中提取,并从另一个表中分离。这通常是前一个查询的更有效的变体。在SQL中,我会写
SELECT item.* FROM item JOIN order on item.order_id = order.id
哪里。。。;
SELECT order.* FROM order WHERE ...;
-
选择item.*FROM item JOIN order on item.order\u id=order.id
WHERE ...
ORDER BY order.name, item.name;
fetch=FetchType.LAZY
,所有的东西都像第一种情况一样被急切地抓取,这有时太糟糕了。我想,使用
Criteria#setFetchMode
,我可以拿到第三箱。我还没试过,因为我还没找到第二个案子。我知道这是
以某种方式
@BatchSize
注释。
-
我说的对吗?
-
有没有办法用旧的标准得到第二个病例?
看起来像是用
createAlias()
导致急切地获取一切。有一些重载允许指定
JoinType
,但我需要指定获取类型。现在,我更困惑了。