我正在运行一个不支持休眠获取模式子选择的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源代码,但是我不知道从哪里开始尝试填充此缺失的功能。
答案 0 :(得分:1)
尝试一下
@OneToMany(fetch = FetchType.EAGER)
@Fetch(value = FetchMode.SELECT)
@BatchSize(size = 10)
private Set<Child> child= new HashSet<Child>();
它将仅执行两个查询,一个查询用于父集合,一个查询用于子集合,根据大小值将加载集合。