当前位置: 首页 > 知识库问答 >
问题:

在JPA中,我如何避免N 1问题与几个关系?

朱经武
2023-03-14

我有以下实体:

@Entity
@Table(name="table1")
public class Entity1 {

    @Id
    private Integer id;

    @OneToMany(mappedBy = "entity1")
    private List<Entity2> entities2;
}

@Entity
@Table(name="table2")
public class Entity2 {

    @Id
    private Integer id;

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name="id")
    private Entity3 entity3;
}

使用我尝试过的标准API:

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Entity1> query = cb.createQuery(Entity1.class);

Root<Entity1> entity1= query.from(Entity1.class);
entity1.fetch("entities2", JoinType.LEFT);
entity1.fetch("entities2", JoinType.LEFT).fetch("entity3", JoinType.LEFT);

但是当执行查询时:

query.select(entity1).where(cb.and(predicates.toArray(new Predicate[predicates.size()]))));
List<Entity1> entities1 = entityManager.createQuery(query).getResultList();

在一个连接中执行多个查询(与实体3有关)。我认为问题是因为关系在另一个连接中。因为当你执行第一个连接时,没有几个查询。

谢谢你的帮助。非常感谢

共有1个答案

甄云
2023-03-14

默认情况下,这些关系类似于hibernate处理how lazy的集合,如果定义了关系how lazy and not received LazyLoadException,请检查配置。

 类似资料:
  • 本文向大家介绍Ruby On Rails中如何避免N+1问题,包括了Ruby On Rails中如何避免N+1问题的使用技巧和注意事项,需要的朋友参考一下 N+1问题 N+1问题是数据库访问中最常见的一个性能问题,首先介绍一下什么是N+1问题: 举个例子,我们数据库中有两张表,一个是Customers,一个是Orders。Orders中含有一个外键customer_id,指向了Customers的

  • 本文向大家介绍关于Python如何避免循环导入问题详解,包括了关于Python如何避免循环导入问题详解的使用技巧和注意事项,需要的朋友参考一下 前言 Python 中使用package时,出现循环导入问题十分常见,我们创建如下package来说明这个问题: 其中, __init__.py 将pkg指定为一个Python package module_a.py中定义了一个action_a()函数,该

  • 我有以下课程: 现在我基本上想加载所有的,但在适用时渴望加载条,所以我使用以下查询: 虽然这是可行的,但它似乎为Bar实体生成了一个SELECT N 1问题: 有没有可能告诉hibernate急切地为子集合中的每个元素加载关联,而不使用N 1 SELECTs? 我尝试了以下查询的思路,这显然不起作用,因为它是一个集合: 我还尝试在(b.bar)bar中使用

  • 在任何情况下,我不想重复计数的每一个页面我需要,这个信息是需要的只是第一次调用。

  • 问题内容: 我通过遵循一些pygame教程来学习Python 。 在其中我发现了关键字 self的 广泛使用,并且主要来自Java背景,我发现自己一直忘记键入 self 。例如,代替我输入,因为对我来说, rect 已经是该类的成员变量。 Java的并行的我能想到的这种情况是有前缀成员变量的所有引用与 此 。 我是否在所有成员变量前面都加上了 self 前缀,还是有一种方法可以声明它们,而不必这样

  • 我正在开发一个具有多个模块的基于Eclipse3.7RCP的应用程序。模块A是一系列库,包括MyBatis-3.2.2.jar。模块B依赖于模块A(manifest.mf中的Require-Bundle),并具有使用MyBatis访问数据库中数据的代码。我在模块B中导出了带有映射器类和XML的包,并在模块A中导入了它们。我正在代码中构建SqlSessionFactory,如果我按名称添加所有映射器