Spring Data JPA 高级应用

本文介绍了Spring Data JPA中Specifications用于动态查询的方法,包括单个对象、多个对象、分页和排序查询,以及计数操作。接着讨论了多表关系,如一对一、一对多和多对多。对于一对多关系,特别是双向一对多时,提到了序列化可能导致的死循环问题,并提供了Jackson和Fastjson的解决方案。文章建议避免使用双向一对多,推荐使用单向一对多,同时指出在某些情况下多对多关系的复杂性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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. 多对多

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

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值