JPA的fetch和join有什么区别?join已经被弃用了吗?

3

好的。我知道它们之间的区别,但是在查询对象属性时,我应该避免使用连接,只需使用fetch或joinfetch。比方说,如果我想要获取一个组的学生列表,我应该查询组并访问学生吗?还是通过与学生连接查询组?或者两者都一样。

我在没有双向关系的情况下工作。


我知道它们之间的区别 - 我认为你并不知道。"fetch vs join"作为比较是没有意义的,这两个概念是正交的。 - skaffman
1个回答

5
当你想要避免懒加载/强制急切加载时,应该使用fetch/fetch join。
例如,当你查询一组或一组列表时:select * from Group where id=?? 直到你对group.getStudents()做些什么之前,学生不会从数据库中加载。如果你仍然在事务内部,那么你将从数据库中加载学生;如果你在事务外部,你将得到一个懒加载异常。
如果你使用:select g from Group g fetch join g.students,则会立即从数据库中加载组及其所有学生。
所以你应该总是使用fetch join吗?不是的,只有在需要时才使用。
如果你知道每次都需要访问所有组的所有学生,则一次性获取它们是有意义的。如果你根本不需要访问学生,那么使用fetch就没有意义。
这也是为什么在集合上使用FetchType.EAGER通常是非常糟糕的想法的原因!

聪明的回答。但是我谈论的是joinfetch eclipselink注释,而不是jpql查询中的join fetch。例如:通过组获取学生时,不需要进行查询,因为在查询组时可以变成lazy。因此,这实际上是jpql join与jpa fetchjoin注释之间的比较。 - user1096311
好的,抱歉。我现在明白了。对不起,英语不是我的母语。那么如果学生有一个项目列表怎么办?如果我查询小组,它会获取项目吗?例如:查询:select g from grupo g where g.id=1。那么我可以这样做吗?Mygroup.getstudents().get(0).getproyects();? - user1096311
默认情况下,它也是懒加载的。因此,在事务中,您可以这样做。但是,您也可以使用fetch join:select g from Group g fetch join g.students s fetch join s.projects - barsju
哦,我听说有一个懒惰异常。我该怎么做才能避免它? - user1096311

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接