jpa查询中加入和路径导航的区别

Difference between join and path navigation in jpa query

我有以下 2 个实体:

class User {
private String name;
private UserType userType;
}

class UserType {
private String name;
}

我想获取 userType 名称等于 'admin' 的所有用户。 我可以编写以下 2 个 return 相同结果的查询。

select u from User u where u.userType.name = 'admin';

select u from User u join u.userType ut where ut.name = 'admin';

只是想了解哪种方法更可取,有何区别。 如果我总是可以使用实体之间的导航获得结果,我什么时候要遵循连接方法?

从技术上讲,它们是等效的,但第二个更灵活。

使用显式连接语法,您可以使用 ON 条件将 JOIN 更改为 LEFT JOIN

select u 
from User u 
left join u.userType ut on ut.name = 'admin'

这个查询总是 return 一个用户,即使它没有用户类型,所以有时这对于某些特定的用例是可取的。

在分析两个查询(jpa + Spring 数据)生成的 SQL 时,观察到导航导致交叉连接,而仅提及 'join' 导致内部连接默认加入。

因此,导航不如显式加入所需列那样高效。