**1. Sort類與Pageable接口**
Spring Data Jpa 可以在方法參數中直接傳入`Pageable`或`Sort`來完成動態分頁或排序,通常`Pageable`或`Sort`會是方法的最后一個參數。
```java
List<Student> findBySex(String sex, Sort sort);
Page<Student> findBySex(String sex, Pageable pageable);
/**
* HSQL語句分頁查詢
*/
@Query(value = "select s from student s where s.age >= ?1")
Page<Student> findByAge(Integer age, Pageable pageable);
/**
* 原生SQL語句分頁查詢,必須要結合 countQuery 查詢出總數
*/
@Query(
value = "select * from student where total >= ?1"
, countQuery = "select count(id) from student where total >= ?1"
, nativeQuery = true
)
Page<Student> findByTotal(Integer total, Pageable pageable);
```
<br/>
**2. 只排序,不分頁**
可以調用下面重載的4個方法來完成排序規則。
```java
package org.springframework.data.domain;
public class Sort implements Streamable<Sort.Order>, Serializable {
//默認并且只能升序排序
public static Sort by(String... properties)
//同一條語句既可以升序排序,也可以降序排序
public static Sort by(List<Sort.Order> orders)
public static Sort by(Sort.Order... orders)
//同一條語句只能按照升序,或降序排序
public static Sort by(Sort.Direction direction, String... properties)
}
```
```java
@Test
public void testSort() {
//1. 根據age和height升序排序
Sort sort1 = Sort.by("age", "height");
List<Student> studentList1 = studentRepository.findBySex("男", sort1);
System.out.println(studentList1);
//[Student(id=1, name=張三, age=19, sex=男, height=170),
// Student(id=2, name=張田, age=21, sex=男, height=165),
// Student(id=7, name=小明, age=22, sex=男, height=173)]
//2. 根據age和height升序排序
Sort sort2 = Sort.by(Sort.Direction.ASC, "age", "height");
List<Student> studentList2 = studentRepository.findBySex("男", sort2);
System.out.println(studentList2);
//[Student(id=1, name=張三, age=19, sex=男, height=170),
// Student(id=2, name=張田, age=21, sex=男, height=165),
// Student(id=7, name=小明, age=22, sex=男, height=173)]
//3. 先根據age升序排序,然后再根據height降序排序
Sort sort3 = Sort.by(Sort.Order.asc("age"), Sort.Order.desc("height"));
List<Student> studentList3 = studentRepository.findBySex("男", sort3);
System.out.println(studentList3);
//[Student(id=1, name=張三, age=19, sex=男, height=170),
// Student(id=2, name=張田, age=21, sex=男, height=165),
// Student(id=7, name=小明, age=22, sex=男, height=173)]
//4. 先根據age升序排序,然后再根據height降序排序
List<Sort.Order> sortList = new ArrayList<>(2);
sortList.add(Sort.Order.asc("age"));
sortList.add(Sort.Order.desc("height"));
Sort sort4 = Sort.by(sortList);
List<Student> studentList4 = studentRepository.findBySex("男", sort4);
System.out.println(studentList4);
//[Student(id=1, name=張三, age=19, sex=男, height=170),
// Student(id=2, name=張田, age=21, sex=男, height=165),
// Student(id=7, name=小明, age=22, sex=男, height=173)]
}
```
**3. 分頁并排序**
分頁可以調用接口`Pageable`來完成,而`Pageable`可以通過下面3個重載方法來構造。
```java
package org.springframework.data.domain;
public class PageRequest extends AbstractPageRequest {
//只分頁不排序
public static PageRequest of(int page, int size)
//既分頁又排序。排序可以升序也可以降序
public static PageRequest of(int page, int size, Sort sort)
//既分頁又排序。排序只能是降序或升序
public static PageRequest of(int page, int size, Direction direction, String... properties)
}
```
```java
@Test
public void testPageable() {
Pageable pageable = PageRequest.of(0, 2, Sort.by(Sort.Order.asc("age"),Sort.Order.desc("height")));
Page<Student> studentPage = studentRepository.findBySex("男", pageable);
if(!studentPage.isEmpty()) {
//獲取數據
System.out.println(studentPage.getContent());
//[Student(id=1, name=張三, age=19, sex=男, height=170),
// Student(id=2, name=張田, age=21, sex=男, height=165)]
}
}
```
- MapStruct屬性映射
- MapStruct是什么
- maven依賴
- 基本映射
- 字段名不一致的映射
- 字段類型不一致的映射
- 基本數據類型轉換
- 日期格式轉換
- 使用表達式轉換
- 枚舉映射
- 多個源類的映射
- 集合的映射
- 添加自定義映射方法
- 映射前后
- 添加默認值
- 映射異常處理
- SpringDataJPA
- SpringDataJPA是什么
- 與JPA、Hibernate的關系
- 環境搭建
- 簡單CURD操作
- 內部原理
- 主鍵生成策略
- 聯合主鍵
- 查詢方式
- 方法命名規則查詢
- 限制查詢結果查詢
- 注解@Query查詢
- 命名參數查詢
- SpEL表達式查詢
- 原生查詢
- 更新與刪除
- Specification動態查詢
- 核心接口
- 查詢例子
- 分頁查詢與排序
- 多表查詢
- 一對一查詢
- 一對多查詢
- 多對多查詢
- 注意事項
- Specification多表查詢
- @Query多表查詢
- 只查詢指定字段
- 級聯操作
- 加載規則