在企业应用开发中,经常需要做多表联合的查询,用Spring Boot Data JPA, 我们也能很方便的实现这个需求。
实体(表)说明
在本文中,我们使用课堂案例中使用的两张关联表来演示多表查询。表对应的实体如下:
- 账号信息表:
1 |
|
- 交易记录表:
1 |
|
需要注意的是:我们没有使用JPA中在实体中定义映射关系的方法,而是自己管理关系
查询指定账号的交易记录
功能需求:以账号中的手机号码为查询条件,查询该账号的全部交易记录。
要完成这个查询需求,我们可以在账号对象对于的 repository 类中添加对应的查询方法。
使用JPQL,返回数组
在 AccountRepository 中添加一个查询方法,如下:
1 | "SELECT t.currDate, t.type, t.amount, a.mobile FROM TradeHist as t inner join Account as a on t.accountId = a.id WHERE a.mobile = :mobile") ( |
表中返回的每一条数据会是对象对象数组中的一个值,而该值又是一个对象数组,其中的每一项对应查询中”SELECT”子句中的每一个字段。
使用值对象
用上面的方法,在真实的场景中往往还需要将结果转换为具体的类型,泗洪起来比较麻烦,所以我们也可以定义相应的对象来绑定结果,实现自动数据类型的自动转换。
定义 DTO
1 |
|
修改@Query中的JPQL语句:
1 | "SELECT new cn.com.hohistar.spbt.todoapi.dto.TradeHistDto(t.currDate, t.type, t.amount, a.mobile) FROM TradeHist as t inner join Account as a on t.accountId = a.id WHERE a.mobile = :mobile") ( |
注意:需要使用类的全名