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