HIbernate OneToManyLoader对集合中的每个项目执行选择

时间:2018-11-09 19:00:43

标签: hibernate

我正在运行一个不支持休眠获取模式子选择的grails应用。集合中的每个项目都使用单独的select语句获取。

我发现了这个堆栈溢出建议Hibernate: best practice to pull all lazy collections

entity.collection.size()// call size to force hibernate to load the full collection

但这会导致对集合中的每个项目进行单独选择。

因此,我在github上发现了一个实用程序类,专门用来作为grails的替代品 https://gist.github.com/mirasrael/2fb953ee95b0c9d16880e4cfb2477e76

我在我的Hibernate版本中运行了它,但关键是...。

CollectionLoader loader = new OneToManyLoader(collectionPersister, entityIds.length, sf, LoadQueryInfluencers.NONE) :
loader.loadCollectionBatch(session, entityIds, collectionPersister.getKeyType());

...导致Hibernate仍然为集合中的每个项目运行 单独 选择查询,这不是预期的行为。

我开始阅读可用的Hibernate源代码,但是我不知道从哪里开始尝试填充此缺失的功能。

1 个答案:

答案 0 :(得分:1)

尝试一下

 @OneToMany(fetch = FetchType.EAGER)
 @Fetch(value = FetchMode.SELECT)
 @BatchSize(size = 10)
 private Set<Child> child= new HashSet<Child>();

它将仅执行两个查询,一个查询用于父集合,一个查询用于子集合,根据大小值将加载集合。