springboot-data-jpa預設方法支援排序,當然複雜的場景需要自己重寫預設的方法,下面介紹四種常用的排序方法
首先需要定義一個依賴的對象
@Data
public class Person{
private Integer id;
private String name;
private int sex;
private String address;
}
定義Repository
@Repository
public interface PersonRepository extends JpaRepository<Person, Integer> {
///方法的定義
}
-
自定義接口
如果我們隻需要做簡單查詢,其中一個字段需要作為排序,則可以使用jpa支援自定義接口的辦法即可
@Repository
public interface PersonRepository extends JpaRepository<Person, Integer> {
findByNameOrderByIdDesc(String name);
findByNameOrderByIdAsc(String name);
}
使用該方法的好處是業務邏輯代碼簡單,缺點是可擴充性不太好,支援升序或者降序操作,當一個接口需要同時支援升序或者降序時,則不适用。
- @query接口
@Repository
public interface PersonRepository extends JpaRepository<Person, Integer> {
@Query(" from Person WHERE name = ?1 ORDER BY id ?2")
List<Person> findInOrders(String name, String order);
}
使用該方法還是隻能支援單個字段排序,優點是業務邏輯代碼簡單,另外比上一種更靈活,同時支援升序和降序排序。
- Sort方法
@Repository
public interface PersonRepository extends JpaRepository<Person, Integer> {
List<Person > findByname(String name, Sort sort)
}
使用該方法支援多個字段排序,優點是業務邏輯代碼簡單,代碼看上去更優雅,同時支援升序和降序排序。缺點是所有字段必須同時支援同一種排序方式
除了上述三種方式外,還有支援複雜的查詢及排序
-
接口重寫
需要繼承接口JpaSpecificationExecutor
@Repository
public interface PersonRepository extends JpaRepository<Person, Integer>, JpaSpecificationExecutor<Person> {
}
在服務實作類裡面需要重寫toPredicate方法
public class PersonServiceImpl{
PersonRepository repository;
findByCond(Condition cond){
repository.findAll(new Specification<Person>(){
PageRequest pageable = new PageRequest(cond.page, cond.size);
@Override
public Predicate toPredicate(Root<Person> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
//業務邏輯代碼
}, pageable)
}
}
該方法最大的優勢是可擴充性非常的高,可以添加多條件,同時支援多字段排序字段,每個字段的排序規則根據實際情況可以自由變化。
好了,先分享到這裡