jpa root.join
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 root.join