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