本章小宋带同学们了解一下JPA的连表查询和分页操作

目录

  • JPA连表查询和分页
    • 1.实体类
    • 2. 自定义Sql实现连表查询
    • 2. 自定义 SQL 语句连表查询并实现分页操作
    • 3. IN的操作查询
    • 4. BETWEEN操作查询
    • 5. 测试

JPA连表查询和分页

这里我们继续讲JPA如何实现连表和分页,因为JPA可以在repository层自定义sql所以也不难。

1.实体类

创建三个实体类。

@Entity
@Data
@NoArgsConstructor
publicclass Company {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(unique = true)private String companyName;private String description;public Company(String name, String description) {this.companyName = name;this.description = description;}
}
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
publicclass School {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(unique = true)private String name;private String description;
}
@Entity
@Data
@NoArgsConstructor
publicclass Person {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(unique = true)private String name;private Integer age;private Long schoolId;private Long companyId;public Person(String name, Integer age) {this.name = name;this.age = age;}}

2. 自定义Sql实现连表查询

假如我们当前要通过 person 表的 id 来查询 Person 的话,我们知道 Person 的信息一共分布在Company、School、Person这三张表中,所以,我们如果要把 Person 的信息都查询出来的话是需要进行连表查询的。

首先我们需要创建一个包含我们需要的 Person 信息的 DTO 对象,我们简单第将其命名为 UserDTO,用于保存和传输我们想要的信息。

@Data
@NoArgsConstructor
@Builder(toBuilder = true)
@AllArgsConstructor
publicclass UserDTO {private String name;privateint age;private String companyName;private String schoolName;
}

写一个方法查询Person的基本信息

 /*** 连表查询*/@Query(value = "select new com.saijia.modules.live.entity.UserDTO(p.name,p.age,c.companyName,s.name) " +"from Person p left join Company c on  p.companyId=c.id " +"left join School s on p.schoolId=s.id " +"where p.id=:personId")Optional<UserDTO> getUserInformation(@Param("personId") Long personId);

2. 自定义 SQL 语句连表查询并实现分页操作

查询当前所有的人员信息并实现分页,可以按照下面这种方式.为了实现分页,我们在@Query注解中还添加了 countQuery 属性

@Query(value = "select new com.saijia.modules.live.entity.UserDTO(p.name,p.age,c.companyName,s.name) " +"from Person p left join Company c on  p.companyId=c.id " +"left join School s on p.schoolId=s.id ",countQuery = "select count(p.id) " +"from Person p left join Company c on  p.companyId=c.id " +"left join School s on p.schoolId=s.id ")
Page<UserDTO> getUserInformationList(Pageable pageable);

使用方法

//分页选项
PageRequest pageRequest = PageRequest.of(0, 3, Sort.Direction.DESC, "age");
Page<UserDTO> userInformationList = personRepository.getUserInformationList(pageRequest);
//查询结果总数
System.out.println(userInformationList.getTotalElements());// 6
//按照当前分页大小,总页数
System.out.println(userInformationList.getTotalPages());// 2
System.out.println(userInformationList.getContent());

3. IN的操作查询

在 sql 语句中加入我们需要筛选出符合几个条件中的一个的情况下,可以使用 IN 查询,对应到 JPA 中也非常简单。比如下面的方法就实现了,根据名字过滤需要的人员信息。

@Query(value = "select new com.saijia.modules.live.entity.UserDTO(p.name,p.age,c.companyName,s.name) " +"from Person p left join Company c on  p.companyId=c.id " +"left join School s on p.schoolId=s.id " +"where p.name IN :peopleList")
List<UserDTO> filterUserInfo(List peopleList);

实际使用:

List<String> personList=new ArrayList<>(Arrays.asList("person1","person2"));
List<UserDTO> userDTOS = personRepository.filterUserInfo(personList);

4. BETWEEN操作查询

查询满足某个范围的值。比如下面的方法就实现查询满足某个年龄范围的人员的信息。

@Query(value = "select new com.saijia.modules.live.entity.UserDTO(p.name,p.age,c.companyName,s.name) " +"from Person p left join Company c on  p.companyId=c.id " +"left join School s on p.schoolId=s.id " +"where p.age between :small and :big")List<UserDTO> filterUserInfoByAge(int small,int big);

实际使用:

List<UserDTO> userDTOS = personRepository.filterUserInfoByAge(19,20);

5. 测试

@SpringBootTest
@RunWith(SpringRunner.class)
publicclass PersonRepositoryTest2 {@Autowiredprivate PersonRepository personRepository;@Sql(scripts = {"classpath:/init.sql"})@Testpublic void find_person_age_older_than_18() {List<Person> personList = personRepository.findByAgeGreaterThan(18);assertEquals(1, personList.size());}@Sql(scripts = {"classpath:/init.sql"})@Testpublic void should_get_user_info() {Optional<UserDTO> userInformation = personRepository.getUserInformation(1L);System.out.println(userInformation.get().toString());}@Sql(scripts = {"classpath:/init.sql"})@Testpublic void should_get_user_info_list() {PageRequest pageRequest = PageRequest.of(0, 3, Sort.Direction.DESC, "age");Page<UserDTO> userInformationList = personRepository.getUserInformationList(pageRequest);//查询结果总数System.out.println(userInformationList.getTotalElements());// 6//按照当前分页大小,总页数System.out.println(userInformationList.getTotalPages());// 2System.out.println(userInformationList.getContent());}@Sql(scripts = {"classpath:/init.sql"})@Testpublic void should_filter_user_info() {List<String> personList=new ArrayList<>(Arrays.asList("person1","person2"));List<UserDTO> userDTOS = personRepository.filterUserInfo(personList);System.out.println(userDTOS);}@Sql(scripts = {"classpath:/init.sql"})@Testpublic void should_filter_user_info_by_age() {List<UserDTO> userDTOS = personRepository.filterUserInfoByAge(19,20);System.out.println(userDTOS);}
}

讲到这里本章对Spring Data Jpa连表查询和分页知识讲解也就结束了,如果想了解更多知识可以在对应的专栏中看系列文章,谢谢大家的观看,希望能给各位同学带来帮助。如果觉得博主写的还可以的,可以点赞收藏

终南山--SpringBoot系列之Spring Data Jpa连表查询和分页相关推荐

  1. Spring Data JPA多表查询

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

  2. SpringBoot系列之Spring Data MongoDB教程

    SpringBoot系列之Spring Data MongoDB教程 1.MongoDB下载安装 因为没有买linux服务器,所以本博客只安装window来学习,可以点击官网下载链接进行下载,安装过程 ...

  3. spring data jpa实现有条件的分页查询功能

    spring data jpa实现有条件的分页查询功能 前端部分代码.发送请求: $('#grid').datagrid({iconCls: 'icon-forward',fit: true,bord ...

  4. spring data jpa 多对多查询

    spring data jpa 多对多查询 以用户-角色 多读多为例: User类,用户 @Entity public class User {private String username;priv ...

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

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

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

    Spring Data JPA 多表关联查询的实现 多表查询在spring data jpa中有两种实现方式,第一种是利用hibernate的级联查询来实现,第二种是创建一个结果集的接口来接收连表查询 ...

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

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

  8. Spring Hibernate JPA 联表查询 复杂查询

    (转自:http://www.cnblogs.com/jiangxiaoyaoblog/p/5635152.html) 今天刷网,才发现: 1)如果想用hibernate注解,是不是一定会用到jpa的 ...

  9. Spring Data JPA 复杂/多条件组合分页查询

    推荐视频: http://www.icoolxue.com/album/show/358 public Map<String, Object> getWeeklyBySearch(fina ...

  10. spring data jpa 的 in 查询 Specification 实现

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 只是一个简单需求:  查询所有部门id 属于  idList 的数据 Page<WorkWei ...

最新文章

  1. IOS、java支持DES加密
  2. Spring教程--IOC(控制反转)详解
  3. python 格式化字符串_Python格式化字符串常用操作
  4. 以下关于java中布局管理说法错误的是_对于 Java 中的布局管理器,以下说法中错误的是( )。_2019复习答案_学小易找答案...
  5. Ubuntu下ICE-3.4.2的安装
  6. 在Linux里设置环境变量的方法(export PATH)--待修改
  7. 云计算(cloud computing)十大问答
  8. android 清理工具,Android 版 Avira Optimizer 是 Android 手機清理工具
  9. 区块链与分享型数据库
  10. python sqlserver 列名_报表自动化,三流用Excel,二流用Python,一流用它
  11. windows Ctrl + Alt + 方向键 取消屏幕反转
  12. MTK:串口调试方法|MTK串口工具
  13. 学习Java开源框架前你应该了解的
  14. Dell灵越 5559笔记本安装固态硬盘 BIOS设置
  15. Vue前端开发——微信扫码支付
  16. windows 10企业版windows Defender无法使用
  17. p2p打洞之nat分类
  18. 微极速彩虹易支付第四方免签支付平台源码
  19. 笔试题(十五):身高体重排序
  20. Windows计算器的制作(C#)

热门文章

  1. mac 无法删除用户
  2. Java理解mian方法
  3. android+cast+sdk,如何使用Android发现Chromecast设备?
  4. python UI自动化自动关闭浏览器学习记录
  5. 拳王虚拟项目公社:虚拟资源项目超详解,人人皆可熟练操作
  6. GOF23设计模式之建造者模式
  7. 林利军2018年致投资人的信:这是一个极致者胜的时代
  8. 谷歌发布研究人口流动性的新方法【智能快讯】
  9. 云计算复习知识总结(很有用,全是干货)
  10. 计算机数学位数,有效位数