我有以下实体及其持久化集合
@Entity
@Table(name = "A")
public class A implements Identifiable<Long> {
@Id
private Long id;
@ElementCollection
@CollectionTable(name = "B", joinColumns = { @JoinColumn(name = "B_ID") })
private Collection<B> bList;
@ElementCollection
@CollectionTable(name = "C", joinColumns = { @JoinColumn(name = "C_ID") })
private Collection<C> cList;
}
在加载10k行A实体之后,我还想加载它的集合
// loading A entities
final List<A> aList = getA();
// looping from 10k results
for (final A a : aList) {
final List<B> bList = a.getB();
final List<C> cList = a.getC();
}
和SELECT语句生成了相当多(~10k)。
这里的表现很差!
有什么想法可以在这里使用批次选择吗?
1条答案
按热度按时间mbjcgjjk1#
我已经解决了这个问题!
想法
在使用@ElementCollection时,Hibernate将负责SQL语句和到实体列表值的Map。使用起来很舒服,但我们有一个折衷方案。我们得到的家长结果越多,我们的表现就越差。如果我们有10k个记录的父级,Hibernate会选择10k次来获取它的子级关系。
而不是为每个父对象加载子对象。创建本地查询以加载所有内容。
我们得到的结果如下:
然后实现Hibernate转换器将这些原始数据库对象转换为DTO。
代码示例。
创建DTO
和变压器
DAO层