终南山--SpringBoot系列之Spring Data Jpa连表查询和分页
本章小宋带同学们了解一下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连表查询和分页相关推荐
- Spring Data JPA多表查询
多表查询在Spring Data JPA中有两种实现方式 第一种创建一个结果集接口来接收多表连查的结果 第二种利用JPA的关联映射来实现 先来熟悉一下几个注解 注解 意思 属性 @ManyToOne ...
- SpringBoot系列之Spring Data MongoDB教程
SpringBoot系列之Spring Data MongoDB教程 1.MongoDB下载安装 因为没有买linux服务器,所以本博客只安装window来学习,可以点击官网下载链接进行下载,安装过程 ...
- spring data jpa实现有条件的分页查询功能
spring data jpa实现有条件的分页查询功能 前端部分代码.发送请求: $('#grid').datagrid({iconCls: 'icon-forward',fit: true,bord ...
- spring data jpa 多对多查询
spring data jpa 多对多查询 以用户-角色 多读多为例: User类,用户 @Entity public class User {private String username;priv ...
- Spring Data JPA多表操作(5)
Spring Data JPA多表操作(5) 数据库中多表之间的关系 多对多 一对多 一对一 一对多示例 数据库设计示例 实体示例 客户:指的是一家公司,我们记为A. 联系人:指的是A公司中的员工. ...
- Spring Data JPA 多表关联查询的实现
Spring Data JPA 多表关联查询的实现 多表查询在spring data jpa中有两种实现方式,第一种是利用hibernate的级联查询来实现,第二种是创建一个结果集的接口来接收连表查询 ...
- Spring Data Jpa多表联合分页查询
参考:https://blog.csdn.net/qq_36144258/article/details/80298354 近期一个项目用到Spring Data Jpa,Jpa用来做单表查询非常的简 ...
- Spring Hibernate JPA 联表查询 复杂查询
(转自:http://www.cnblogs.com/jiangxiaoyaoblog/p/5635152.html) 今天刷网,才发现: 1)如果想用hibernate注解,是不是一定会用到jpa的 ...
- Spring Data JPA 复杂/多条件组合分页查询
推荐视频: http://www.icoolxue.com/album/show/358 public Map<String, Object> getWeeklyBySearch(fina ...
- spring data jpa 的 in 查询 Specification 实现
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 只是一个简单需求: 查询所有部门id 属于 idList 的数据 Page<WorkWei ...
最新文章
- IOS、java支持DES加密
- Spring教程--IOC(控制反转)详解
- python 格式化字符串_Python格式化字符串常用操作
- 以下关于java中布局管理说法错误的是_对于 Java 中的布局管理器,以下说法中错误的是( )。_2019复习答案_学小易找答案...
- Ubuntu下ICE-3.4.2的安装
- 在Linux里设置环境变量的方法(export PATH)--待修改
- 云计算(cloud computing)十大问答
- android 清理工具,Android 版 Avira Optimizer 是 Android 手機清理工具
- 区块链与分享型数据库
- python sqlserver 列名_报表自动化,三流用Excel,二流用Python,一流用它
- windows Ctrl + Alt + 方向键 取消屏幕反转
- MTK:串口调试方法|MTK串口工具
- 学习Java开源框架前你应该了解的
- Dell灵越 5559笔记本安装固态硬盘 BIOS设置
- Vue前端开发——微信扫码支付
- windows 10企业版windows Defender无法使用
- p2p打洞之nat分类
- 微极速彩虹易支付第四方免签支付平台源码
- 笔试题(十五):身高体重排序
- Windows计算器的制作(C#)