【发布时间】:2020-05-24 21:57:19
【问题描述】:
我仍在使用旧的org.hibernate.Criteria,并且对获取模式越来越感到困惑。在各种查询中,我需要以下所有变体,因此无法通过注释对其进行控制。我只是将所有内容都切换到@ManyToOne(fetch=FetchType.LAZY),否则,查询中的任何内容都不会更改。
到目前为止,我能找到的要么涉及 HQL 或 JPA2,要么只提供两种选择,但我需要它来满足旧标准和(至少)以下三种情况:
- 执行 JOIN,并从两个表中提取。除非数据过于冗余(例如,主数据很大或在结果中重复多次),否则这是可以的。在 SQL 中,我会写
SELECT * FROM item JOIN order on item.order_id = order.idWHERE ...; - 执行 JOIN,从第一个表中提取,然后与另一个表分离。这通常是上一个查询的更有效的变体。在 SQL 中,我会写
SELECT item.* FROM item JOIN order on item.order_id = order.idWHERE ...;SELECT order.* FROM order WHERE ...; - 执行 JOIN,但不获取连接的表。这很有用,例如,用于根据其他表的数据进行排序。在 SQL 中,我会写
SELECT item.* FROM item JOIN order on item.order_id = order.idWHERE ...ORDER BY order.name, item.name;
看起来如果没有明确指定fetch=FetchType.LAZY,一切都会像第一种情况一样被急切地获取,这有时太糟糕了。我想,使用Criteria#setFetchMode,我可以得到第三种情况。我还没有尝试过,因为我仍然错过了第二种情况。我知道这是可能的,因为有 @BatchSize 注释。
- 我说的对吗?
- 有没有办法用旧标准获得第二种情况?
更新
看起来使用createAlias() 会导致急切地获取所有内容。有一些重载允许指定JoinType,但我需要指定获取类型。现在,我更加困惑了。
【问题讨论】:
-
快速 ping - 下面的答案对你有用吗@maaartinus?很感兴趣。
-
@ThomasPortwood 抱歉,我还没有时间尝试(这是困扰我很久的问题,但目前还有其他问题)。关于第二种和第三种情况需要投影所有属性,这在某种程度上是不令人满意的,不是吗?
-
我绝对同意这就是我想确认的原因。我很高兴我能够回答有没有办法......这个问题,但我很想听听您是否找到了更优雅的方式。
-
@ThomasPortwood 我想,接受你的回答是最好的,至少现在是这样。当我谈到它时,我可能会重新考虑;)
-
谢谢先生。我会留意更令人满意的方法。
标签: java performance hibernate join hibernate-criteria