【问题标题】:Difference between join and path navigation in jpa queryjpa查询中连接和路径导航的区别
【发布时间】:2016-04-07 17:19:00
【问题描述】:

我有以下 2 个实体:

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

class UserType {
private String name;
}

我想获取所有用户类型名称等于“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';

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

【问题讨论】:

  • 如果需要左外连接怎么办?此外,第一种产生隐式连接的方法是可以避免的,因为它可能会根据使用的 JPA 提供程序产生交叉连接。因此,请始终坚持仔细观察生成的 SQL 语句。

标签: java hibernate jpa orm jpql


【解决方案1】:

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

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

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

即使没有用户类型,此查询也将始终返回用户,因此有时这对于某些特定用例来说是可取的。

【讨论】:

    【解决方案2】:

    在分析由两个查询(jpa + Spring Data)生成的 SQL 时,观察到导航会导致交叉连接,而默认情况下仅提及“连接”会导致内部连接。

    因此,导航不如明确加入所需的列高效。

    【讨论】:

    • 对于这种行为似乎没有普遍的共识。 Hibernate 意外地产生了一个交叉连接,EclipseLink 按预期产生了一个内部连接,其他提供者可能有自己的行为。显然不应该依赖于不同提供商的这种恼人行为,这将导致跨不同提供商的不可移植业务逻辑,其中根本没有使用任何专有功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多