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)
CriteriaBuilder即cb中有许多方法,可以自行查看源码
二、多表之间的关系,多表之间的操作步骤
多表之间的关系:
1. 一对一
2. 一对多:
一的一方为主表,多的一方为从表,需要在从表中添加一列作为外键,取值来源于主表
分为双向一对多, 单向一对多, 单向多对一,若为双向一对多时,要特别注意序列化时陷入死循环,解决办法如下:
当使用的是jackson处理时,用注解@JsonIgnoreProperties(value={"要忽略的属性"})
当使用fastjson处理时,用注解@JSONField(serialize = false)
默认情况下: 从多的一方查询一的一方默认是立即加载,从一的一方查询多的一方默认是延迟加载
这里十分不推荐使用双向一对多的关系,因为会有很多的问题,比如序列化死循环,toString死循环,延迟加载问题等,在实际开发中还是使用单向一对多比较好。
没有解决的问题记录: 如图配置好双向一对多关系,使用postman测试接口,查询company,但是不能得到users,原因是OneToMany默认是延迟加载,但是如果使用junit单元测试就可以得到正确的结果。
How to do?
单向一对多代码:
3. 多对多
需要中间表,最少由两列组成,分别作为外键分别指向两张表的主键,又形成联合主键
这里坑也很多,尽可能不用吧!