Spring Data JPA 高级应用

一、Specifications动态查询

使用的是JpaSpecificationExecutor下的方法:

1. 查询一个对象

T findOne(Specification<T> specification)

2. 查询对个对象

List<T> findAll(Specification<T> specification)

3. 分页查询多个对象

Page<T> findAll(Specification<T> specification, Pageable page)

4. 排序查询多个对象

List<T> findAll(Specification<T> specification, Sort sort)

5. 查询数量

long count(Specification<T> specification)

Spring Data JPA 高级应用

 

Spring Data JPA 高级应用

 CriteriaBuilder即cb中有许多方法,可以自行查看源码

二、多表之间的关系,多表之间的操作步骤

多表之间的关系:

1. 一对一

2. 一对多:

一的一方为主表,多的一方为从表,需要在从表中添加一列作为外键,取值来源于主表

分为双向一对多, 单向一对多, 单向多对一,若为双向一对多时,要特别注意序列化时陷入死循环,解决办法如下:

当使用的是jackson处理时,用注解@JsonIgnoreProperties(value={"要忽略的属性"}) 

当使用fastjson处理时,用注解@JSONField(serialize = false)

Spring Data JPA 高级应用

Spring Data JPA 高级应用

默认情况下: 从多的一方查询一的一方默认是立即加载,从一的一方查询多的一方默认是延迟加载

 

这里十分不推荐使用双向一对多的关系,因为会有很多的问题,比如序列化死循环,toString死循环,延迟加载问题等,在实际开发中还是使用单向一对多比较好。

没有解决的问题记录: 如图配置好双向一对多关系,使用postman测试接口,查询company,但是不能得到users,原因是OneToMany默认是延迟加载,但是如果使用junit单元测试就可以得到正确的结果。

How to do?

单向一对多代码:

Spring Data JPA 高级应用

3. 多对多

需要中间表,最少由两列组成,分别作为外键分别指向两张表的主键,又形成联合主键

这里坑也很多,尽可能不用吧!