Spring Data JPA 多表关联查询的实现

多表查询在spring data jpa中有两种实现方式,第一种是利用hibernate的级联查询来实现,第二种是创建一个结果集的接口来接收连表查询后的结果。第一种方式需要继承JpaSpecificationExecutor接口,利用Specification 进行复杂查询,还需要定义好表之间的映射关系,比较复杂。所以这里还是介绍第二种比较简单的方式。

一对一映射

  1. 创建实体类:
  • UserInfo类
@Entity
@Data
@Table(name="tb_user")
public class UserInfo implements Serializable {@Id@GeneratedValue(strategy=GenerationType.IDENTITY)private Long userId;private String name;private int age;private String sex;private String email;// 与 Address 的关联private Long addressId;}
  • Address类
@Entity
@Data
@Table(name = "tb_address")
public class Address {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long addressId;private String areaCode;private String country;private String province;private String city;private String area;private String detailAddress;}
  • PartViewInfo类(关联查询的结果存储类)
@Data
public class PartViewInfo {private String name;private String areaCode;//满参构造函数public PartViewInfo(String name, String areaCode) {this.name = name;this.areaCode = areaCode;}}
  1. 持久层:
  • AddressRepository接口
public interface AddressRepository extends JpaRepository<Address, Long> {}
  • UserInfoRepository
public interface UserInfoRepository extends JpaRepository<UserInfo, Long> {@Query("select new com.example.jpatestformanytable.entity.PartViewInfo(u.name, a.areaCode) from UserInfo u, Address a where u.addressId = a.addressId")public List<PartViewInfo> findViewInfo2();
}
  1. 测试代码:
@SpringBootTest
public class sdda {@Autowiredprivate UserInfoRepository userInfoRepository;@Autowiredprivate AddressRepository addressRepository;public void init() {Address addr1 = new Address("027","CN","HuBei", "WuHan","WuChang", "123 street");Address addr2 = new Address("023","CN","ChongQing", "ChongQing","YuBei", "123 road");addressRepository.save(addr1);addressRepository.save(addr2);UserInfo user1 = new UserInfo("ZS", 21,"Male","123@xx.com", addr1.getAddressId());UserInfo user2 = new UserInfo("Ww", 25,"Male","234@xx.com", addr2.getAddressId());userInfoRepository.save(user1);userInfoRepository.save(user2);}public void deleteAll() {userInfoRepository.deleteAll();addressRepository.deleteAll();}@Testpublic void testQuery() {init();List<PartViewInfo> partViewInfoList = userInfoRepository.findViewInfo2();for (PartViewInfo partViewInfo : partViewInfoList) {System.out.println(partViewInfo);}deleteAll();}}
  1. 测试结果:
  • 使用到的相关sql语句
Hibernate: insert into tb_address (area, area_code, city, country, detail_address, province) values (?, ?, ?, ?, ?, ?)
Hibernate: insert into tb_address (area, area_code, city, country, detail_address, province) values (?, ?, ?, ?, ?, ?)
Hibernate: insert into tb_user (address_id, age, email, name, sex) values (?, ?, ?, ?, ?)
Hibernate: insert into tb_user (address_id, age, email, name, sex) values (?, ?, ?, ?, ?)
Hibernate: select userinfo0_.name as col_0_0_, address1_.area_code as col_1_0_ from tb_user userinfo0_ cross join tb_address address1_ where userinfo0_.address_id=address1_.address_id
Hibernate: select userinfo0_.user_id as user_id1_1_, userinfo0_.address_id as address_2_1_, userinfo0_.age as age3_1_, userinfo0_.email as email4_1_, userinfo0_.name as name5_1_, userinfo0_.sex as sex6_1_ from tb_user userinfo0_
Hibernate: delete from tb_user where user_id=?
Hibernate: delete from tb_user where user_id=?
Hibernate: select address0_.address_id as address_1_0_, address0_.area as area2_0_, address0_.area_code as area_cod3_0_, address0_.city as city4_0_, address0_.country as country5_0_, address0_.detail_address as detail_a6_0_, address0_.province as province7_0_ from tb_address address0_
Hibernate: delete from tb_address where address_id=?
Hibernate: delete from tb_address where address_id=?
  • 得到的结果
PartViewInfo{name='ZS', areaCode='027'}
PartViewInfo{name='Ww', areaCode='023'}
  1. 易出问题的地方:
  • 持久层的sql语句中,定义别名后就要全用别名,否则报错。
  • 结果类中,要自定义一个满参数的构造函数,不能靠Lombok。

参考

Spring Data JPA 实现多表关联查询

Spring Data JPA 多表关联查询的实现相关推荐

  1. Spring Data JPA_多表关联查询中应该注意的问题

    今天在写Spring Data JPA的时候发现这样一个问题 问题如下: Caused by: org.hibernate.DuplicateMappingException: Table [sys_ ...

  2. Spring boot jpa 多表关联查询

    效果图: 如图,根据条件查询主表信息,并关联获取详细数据,并实现简单的排序功能,不多说,上代码: model: /** * @author xj * @date 2017/5/3 13:31 */ @ ...

  3. Spring Data JPA多表操作(5)

    Spring Data JPA多表操作(5) 数据库中多表之间的关系 多对多 一对多 一对一 一对多示例 数据库设计示例 实体示例 客户:指的是一家公司,我们记为A. 联系人:指的是A公司中的员工. ...

  4. jpa多表关联查询_JPA【关联查询篇】

    摘要:本文主要介绍JPA的多表关联查询(一对一.一对多.双向关联.多对一.多对多)以及N+1查询的优化. 1. JPA多表关联查询 多表关联查询就是实现使用一个实体类对象操作或者查询多个表的数据. 配 ...

  5. Spring Data JPA多表查询

    多表查询在Spring Data JPA中有两种实现方式 第一种创建一个结果集接口来接收多表连查的结果 第二种利用JPA的关联映射来实现 先来熟悉一下几个注解 注解 意思 属性 @ManyToOne ...

  6. Spring Data Jpa多表联合分页查询

    参考:https://blog.csdn.net/qq_36144258/article/details/80298354 近期一个项目用到Spring Data Jpa,Jpa用来做单表查询非常的简 ...

  7. ORM框架之Spring Data JPA(三)高级查询---复杂查询

    一.spring data jpa高级查询 1.1Specifications动态查询 有时我们在查询某个实体的时候,给定的条件是不固定的,这时就需要动态构建相应的查询语句,在Spring Data ...

  8. SpringBoot (四):JPA(多表关联查询)

    Spring Boot Jpa 是 Spring 基于 ORM 框架.Jpa 规范的基础上封装的一套 Jpa 应用框架,可使开发者用极简的代码即可实现对数据的访问和操作.它提供了包括增删改查等在内的常 ...

  9. jpa多表关联查询_Spring Boot 整合mybatis如何自定义 mapper 实现多表关联查询

    上一篇文章已经介绍了自定义 mapper 实现自定义的方法,其实实现了通过自定义的mapper就可以做多表关联等复杂查询.但是很多朋友还是反馈说没有实现多表关联查询,所以,今天把文章又重新修改了,增加 ...

最新文章

  1. [Nhibernate]对象状态
  2. 如何处理xml文件!看看这里
  3. 轻量级数据库Sqlite的使用
  4. springboot打包时加入本地jar打包
  5. 笔记-项目合同管理-项目合同谈判与签订-供应商项目立项
  6. keras从入门到放弃(十六)内置预训练网络VGG
  7. 30分钟3300%性能提升—python+memcached网页优化小记
  8. java 只显示文本文件_Java设计并实现一个应用程序,能够读取一个文本文件中的内容并显示,同时能够计算出文本中的行数。...
  9. .Neter们,你真的应该了解下EFCore3.x
  10. 7-1 字母统计图 (10 分)(思路+详解)
  11. Linux Shell脚本专栏_自动发布Java项目(tomcat)_10
  12. csv 中 数值被自动转换成科学计数法 的问题 excel打开后数字用科学计数法显示且低位变0的解决方法
  13. linux使用mount命令挂载、umount命令取消挂载
  14. mysql必知必会心得_SQL必知必会知识总结
  15. 2021考研数学二汤家凤接力题典1800【解答册】
  16. ACM International Collegiate Programming Contest, Egyptian Collegiate Programming Contest (ECPC 2015
  17. Java基础:常用类(String类)
  18. 多益网络2015校园招聘面试题目大揭秘
  19. clojure 开发工具_Clojure Web开发–最新技术–第2部分
  20. getElementByClassName

热门文章

  1. PowerShell基本教程
  2. 编写测试用例的七种方法
  3. js关于setTimeout实现延时执行函数并进行传参
  4. ios 证书加轻松签名多开VX 工具
  5. Learning reward machines for partially observable reinforcement learning论文阅读
  6. 解决idea注释自动在行首的问题
  7. BugFree安装手册
  8. Centos系统临时修改时间、永久修改时间
  9. python的内存管理_python如何管理内存?
  10. Word365英文版,从当前页开始插入页码