JPA 2.1和Java EE 7中的JPQL增强功能(第1部分– JOIN ON)

Java EE 7已经存在了几年,它提供了一些非常有用且期待已久的功能,例如实体图以及对存储过程和结果映射的更好支持。 有关概述,请参阅Thorben Janssen的博客文章 。 但是,我想添加有关JPA查询语言功能的更详细的摘要。 在JPQL和Criteria API中都可以使用它们:

  • ON关键字为JOIN指定条件
  • FUNCTION调用任意数据库函数
  • 处理将实体下调到其特定类型

在本文中,我将重点介绍第一个新增内容。 我将在下一篇文章中添加其他2个。

加入

JPA中的JOIN表达式已经与标准SQL中的JOIN有所不同。 仅当实体之间的映射已经存在时才可以使用JOIN,并且由于使用隐式联接的相关集合的延迟加载而并非总是必需的。 如果您是JPA的初学者,请小心使用JPA JOIN,并仔细阅读文档 。

在JPA 2.1之前,只能使用WHERE子句中的条件过滤最终查询结果。 在大多数情况下,这就足够了。 但是,在使用LEFT JOIN时,您遇到了一个极限,并且想要限制从另一个实体中要联接的对象。 使用LEFT JOIN,您总是总是从第一个实体获得至少一行,但是有时您不想合并来自另一个实体的任何实例,而使最终集合为空。

除了在Hibernate中使用WITH关键字外,在JPA中以前没有标准的方法可以做到这一点。 从JPA 2.1开始,可以使用ON关键字为连接添加条件,类似于SQL JOIN ON。

在JPA中使用JOIN ON的示例

SELECT a FROM Person p LEFT JOIN p.addresses a ON a.city = p.city

上面的代码段将仅检索与该人具有相同城市的那些地址。 通过将条件移到WHERE中可以实现相同的目的,因此我们需要一个具有多个联接的更复杂的示例才能看到其优势:

在JPA中使用JOIN ON的示例

SELECT c FROM Person p LEFT JOIN p.addresses a ON a.city = p.city LEFT JOIN a.country c ON c.region = 'Europe'

在上面的示例中,我们仅获得所在国家/地区,地址和地址存在,并且其人员拥有相同的城市。 使用WHERE有什么区别? 如果最后将ON子句中的两个条件都放在WHERE中,则将包括与一个人的所有地址相关的所有国家,而不仅包括与同一城市相同的地址。 显然,仅在最后应用条件时,结果可能会更大。 使用ON关键字可以在每次联接之后过滤结果,从而在每次连续联接之后得到较小的结果。

但是,即使在将JOIN与ON一起使用时,仍然存在一个限制–实体仅在将它们映射为相关实体时仍然可以联接。

在Eclipselink中以多个根加入

Eclipselink为标准JPA On关键字提供了附加功能。 可以在ON条件下关联不相关的实体 ,从而可以将不相关的实体加入到查询中已经存在的其他实体。 因此,即使我们仅需要单个报告的联接条件,也不希望更新映射,也不需要将字段标记为相关。 同样,从映射生成数据库表和约束的测试由于某种原因(例如,如果大量测试数据中可能存在约束违规),也将不希望使用该测试。

这是在Eclipselink中扩展使用ON的示例(JPA 2.1标准中未包括)。 这个人加入了与城市同名的人:

加入多个根实体

SELECT p FROM Person p LEFT JOIN Person p2 ON p2.city = p.city

翻译自: https://www.javacodegeeks.com/2016/02/jpql-enhancements-jpa-2-1-java-ee-7-part-1-join.html

你可能感兴趣的:(JPA 2.1和Java EE 7中的JPQL增强功能(第1部分– JOIN ON))