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' 导致内部连接默认加入。
因此,导航不如显式加入所需列那样高效。
我有以下 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' 导致内部连接默认加入。
因此,导航不如显式加入所需列那样高效。