jpa查询中的连接和路径导航之间的区别

时间:2016-01-04 05:44:07

标签: java hibernate jpa orm jpql

我有以下两个实体:

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';

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

2 个答案:

答案 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'默认情况下会导致内部联接。

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