添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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

Java EE 7已经存在了几年,它提供了一些非常有用且期待已久的功能,例如实体图以及对存储过程和结果映射的更好支持。 有关概述,请参阅Thorben Janssen的博客文章 。 但是,我想添加有关JPA查询语言功能的更详细的摘要。 在JPQL和Criteria API中都可以使用它们: ON关键字为JOIN指定条件 FUNCTION调用任意数据库函数 处理将实体下调到其特定... @Transactional ( readOnly = false ) @Override public User add( User user) throws UsernameInUsedException { // simple and strong typing to count where username is us
多对多关联查询网上多是 Join 的方式,缺点就是需要实体间相互引用,不太灵活。 简单示例:A、B两表关联,代码仅为示意,大概是这样的应该可以理解吧?不想花时间多写了。 aDao.findAll((Root<A> aRoot, Criteria Query<?> cq, Criteria Builder cb) -> { Root<B> bRoot = cq.from(B.class); // Root<C> c
一、数据准备 在管理系统 ,角色和用户是典型一对多关系,一个角色可以分配给多个用户,一个用户对应一个角色。准备两个实体类TestRole、TestUser类,并在 数据库 建好对应表结构z_test_roles、z_test_users两张表。 @Entity @Getter @Setter @Table(name = "z_test_roles") public class TestRole implements Serializable { @Column(na...
//分页及排序 pageInfo.setNumber(pageInfo.getNumber() - 1); Pageable pageable = new PageRequest(pageInfo.getNumber(), pageInfo.getSize(), Sort.Direction.DESC, "issueDate");
sql优化 常用的方法之一就是将表关联或子查询改为 join 的用法,如上图所示 join 的用法有很多种,导致有很多小伙伴经常搞混。本文将通过具体例子介绍SQL 的各种常用 Join 的特性和使用。 准备数据: CREATE TABLE `tb1_ept`( `id` INT(11) NOT NULL AUTO_INCREMENT, `deptName` VARCHAR(30) DEFAULT NULL,...
第1章 Specifications动态查询 有时我们在查询某个实体的时候,给定的条件是不固定的,这时就需要动态构建相应的查询语句,在Spring Data JPA 可以通过 Jpa SpecificationExecutor接口查询。相比 JPQL ,其优势是类型安全,更加的面向对象。 import java .util.List; import org.springframework.data.dom...
相应的实体 需要使用到@OneToMany@ManyToMany@ManyToOne@OneToOne 注释相应的字段。该注解可单独出现在一个实体 ,互相关联的实体没有该注解的约束(例如:一个 用例1:n 的注解另一个并不一定需要增加对应的对象同时也就没有n:1注解的事情了) 通过 join 可以设置左相联还是右 1、先说一对多关系,就以上一章的A模型和B模型,为例 A 对应 多个 B,而现在需求就是查询A和B关联,并需要传入的动态参数,可能是A模型 的属性,也有可能是B模型 的参数 还是用伪代码来说明,并且用的是Specification来查询(上一章有说明) public Page findA(Pageable pageable