Spring Boot Data JPA中多表联合查询(一)

在企业应用开发中,经常需要做多表联合的查询,用Spring Boot Data JPA, 我们也能很方便的实现这个需求。

实体(表)说明

在本文中,我们使用课堂案例中使用的两张关联表来演示多表查询。表对应的实体如下:

  1. 账号信息表:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
public class Account {

@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Integer id;

@Version
private Long version;

@NotNull
private String mobile;

private String nickName;

private Double balance;
}
  1. 交易记录表:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
public class TradeHist {

@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Integer id;

@Version
private Long version;

@NotNull
private Integer accountId;

private Date currDate;

private Integer type;

private Integer accId;

private Double amount;

private String note;
}

需要注意的是:我们没有使用JPA中在实体中定义映射关系的方法,而是自己管理关系

查询指定账号的交易记录

功能需求:以账号中的手机号码为查询条件,查询该账号的全部交易记录。

要完成这个查询需求,我们可以在账号对象对于的 repository 类中添加对应的查询方法。

使用JPQL,返回数组

在 AccountRepository 中添加一个查询方法,如下:

1
2
@Query("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")
public Object[] findTradeHistByMobile(@Param("mobile") String mobile);

表中返回的每一条数据会是对象对象数组中的一个值,而该值又是一个对象数组,其中的每一项对应查询中”SELECT”子句中的每一个字段。

使用值对象

用上面的方法,在真实的场景中往往还需要将结果转换为具体的类型,泗洪起来比较麻烦,所以我们也可以定义相应的对象来绑定结果,实现自动数据类型的自动转换。

定义 DTO

1
2
3
4
5
6
7
8
9
10
11
12
13
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TradeHistDto {

private Date currDate;

private Integer type;

private Double amount;

private String mobile;
}

修改@Query中的JPQL语句:

1
2
@Query("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")
public List<TradeHistDto> findTradeHistByMobileWithType(@Param("mobile") String mobile);

注意:需要使用类的全名

本文标题:Spring Boot Data JPA中多表联合查询(一)

文章作者:梅老师

发布时间:2019年12月16日 - 16:12

最后更新:2020年09月16日 - 08:09

原始链接:https://www.mls-tech.info/java/springboot-jpa-query-mulit-table-1/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。