gpt4 book ai didi

java - 为什么 JPA join 返回太多结果?

转载 作者:行者123 更新时间:2023-11-30 04:51:39 25 4
gpt4 key购买 nike

如果我用 SQL 查询:

select * from Profesor
inner join Estudiantes on Profesor.id = Estudiante.id
where Profesor.nombre = 'juan'
and Estudiante.nombre = 'jose'

此查询返回教授和学生。一名教授和一名学生。只是胡安教授和何塞作为学生。

然后如果我在 JPA 中查询:

select p from Profesor p
inner join p.estudiantes e
where p.nombre = juan
and e.nombre = jose.

JPA 将返回 Juan 教授以及所有学生,而不仅仅是我想要的学生,profesor.estudiantes 将获得包含所有学生的列表学生。

我的类型是:

class Profesor{
private List<Estudiante> estudiantes;
}

class Estudiante{
String matricula;
}

抱歉,我用西类牙语编码。我刚刚才明白这个。

我不知道我的问题是否清楚,请告诉我。

最佳答案

您需要了解两件事。

首先:当您说Select p from Profesor时,JPA 仅从 Profesor 表中选择列,并返回一个包含尚未加载的学生集合的 Profesor 实例。当您第一次实际访问该集合时,它会延迟加载。当它加载集合时,它忘记了您使用哪个查询来加载教授。它加载的是教授的学生的集合。由于一位教授有很多学生,所以它让他们所有人都负担过重。初始查询类似于

select p.* from Profesor inner join ...

在 SQL 中执行它,您会发现它不会加载教授及其学生。它只加载一位教授。

第二:实体应该代表数据库中的数据。它不应该代表查询的结果。因此,教授实体中学生的集合始终是该教授所有学生的集合。

要做你想做的事,你有多种选择:

  1. select p, s from Profesor inner join p.students s...:这将返回一个包含找到的教授和找到的学生的数组。
  2. 如果关联是双向的:select s from Profesor p inner join p.students ...:这将加载学生,并引用其教授
  3. 如果使用 Hibernate,这违反了该领域的 JPA 规范:select p from Profesor inner join fetch p.students...:该 fetch 使 hibernate 在单个文件中加载教授及其学生询问。但由于您在学生上添加了 where 子句,因此它仅加载教授的匹配学生。

请注意,第三种解决方案非常危险,我不建议使用它。首先因为它不是有效的 JPQL。更重要的是,因为获取由此类查询加载的 Professor 实体的代码期望 Professor.getStudents() 将返回该教授的所有学生,而不仅仅是其中之一。因此,它可能会显示错误结果,或修改集合并导致数据库不一致。

关于java - 为什么 JPA join 返回太多结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9711143/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com