我有以下两个实体:
class User {
private String name;
private UserType userType;
}
class UserType {
private String name;
}
我想获取userType名称等于' admin'的所有用户。 我可以编写以下2个返回相同结果的查询。
select u from User u where u.userType.name = 'admin';
和
select u from User u join u.userType ut where ut.name = 'admin';
只是想了解哪种方法更可取,有什么区别。 如果我总是可以使用实体之间的导航来获得结果,那么我何时想要遵循连接方法?
答案 0 :(得分:2)
从技术上讲,它们是等价的,但第二个更灵活。
使用显式联接语法,您可以使用JOIN
条件将LEFT JOIN
更改为ON
:
select u
from User u
left join u.userType ut on ut.name = 'admin'
即使用户没有用户类型,此查询也会始终返回用户,因此有时这对某些特定用例来说是理想的。
答案 1 :(得分:2)
在分析由两个查询(jpa + Spring Data)生成的SQL时,观察到导航导致交叉连接,而仅提及' join'默认情况下会导致内部联接。
因此,导航不如显式加入所需列的效率高。