从实体列表中获取@OneToMany的有效方法

时间:2019-07-02 14:28:05

标签: java spring hibernate jpa one-to-many

我目前正在试图找出一种有效的方法,以便从其他实体列表中获取@OneToMany映射的实体。

让我们来看看细节:
我有E和L这两个类(注意:两者都具有JPA / Hibernate必需的注释等。我只是忽略了这些信息,因为它们对我的情况并不重要)

public class L {
    public String name;
}

public class E {
    @ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
    public List<L> ls = new LinkedList<>();

    public String name;

    [...]

}

对于导出,我想获取所有E对象及其相关信息,包括L的相应列表。通常,我会使用普通的查询来执行此操作,如下所示:

@Query("select e from E e where [...]")

结果将为List<E>

当我继续创建导出文件时,系统会为每个E获取L的列表,如果我们要谈论的条目数为1000,则该列表将汇总。

在我当前的测试系统中,我正在检索3982行,总共需要5323ms。 如果我只获取E实体而不获取L实体,则为338ms。

有没有一种有效的方式可以一次性加载所有信息?我尝试的一种尝试是以下查询:

@Query("select e, l from E e LEFT JOIN e.ls l where [...]")

返回List<Object[]> 使用此查询,行的数量将增加,因为某些E包含的行数大于1 L时可能会重复。

但是也许还有一种我不知道的更好的方法?

1 个答案:

答案 0 :(得分:0)

首次尝试时,您可以尝试两件事:

  1. 将@BatchSize批注添加到列表ls
  2. 确保您在联接列及其引用上具有索引

无法看到自己填写列表的情况:

  1. 查询您想要的所有Es
  2. 提取所有E id
  3. 将ID划分为数据库的in限制内的批量大小
  4. 查询每个分区中所有分区的所有L,并将它们添加到各自的E实例中