我有一个与Parent
实体有@OneToMany
关系的Child
实体。大多数情况下,当我需要使用Parent
的{{1}}实体时,我正在使用单个父级,因此延迟提取(Child
)是合适的。
但是,我遇到的情况是我要查询大量的FetchMode.SELECT
(有时数百甚至数千),我需要使用他们的Parent
实体。 Child
给了我一个严重的N + 1问题,因此我需要在这种情况下做一些不同的事情。如果我是通过JDBC执行此操作,那么它将是FetchMode.SELECT
个记录的单个查询,然后使用Parent
语句(Child
语句对所有IN
个记录进行另一个查询。我需要实时的Hibernate实体,因为Hibernate Search将调用getChildren()作为其索引过程的一部分。
我考虑的选项是:
where child.parentid in (?,?,?....)
(或HQL中的Criteria.setFetchMode(“children”, FetchMode.JOIN)
) - 这会给我一个笛卡尔积,但这对许多实体来说是残酷的。join fetch
添加到@BatchSize
- 这对我的大批量方案有帮助,但它并不是我想要用于正常操作的策略。如果我可以在Criteria / HQL中为fetch设置批量大小,那将是完美的,但我找不到这样做的方法。Parent.getChildren()
中使用FetchMode.SUBSELECT
- 与Parent.getChildren()
非常相似,这对我的大批量方案来说非常有用,但不适合正常操作,我找不到使用Criteria / HQL的方式(条件和实体注释使用不同的FetchMode枚举,尽管名称重复)。tldr;我与懒惰的获取模式有一对多的关系,但有时我希望能够一次有效地加载许多实体的关系。