使用Spring Data Jpa查詢全部並排序
Spring Data Jpa查詢全部並排序
1、Repository層隻需要簡單地extends JpaRepository
依舊不用寫任何東西。因為它自己其實有一個findAll(Sort sort)的方法,直接用就可以瞭。
2、Service層中如下
List<xxxDO> xxxDOS = xxxRepository.findAll(new Sort(Sort.Direction.ASC,"屬性名"));
但註意springboot2.2.1及以上的版本Sort的構造方法變為私有,需要像下面這樣寫:
List<xxxDO> xxxDOS = xxxRepository.findAll(Sort.by(Sort.Direction.ASC,"屬性名"));
JPA之排序問題
1、總覽
本文將要探討的是用於Java Persistence API(JPA)排序的各種實現方式,它們適用於簡單實體以及一對多關系中的實體。這些方法將排序工作的負擔委托給數據庫層。
2、使用JPA / JQL API排序
通過使用Order By關鍵詞實現JQL排序:
String jql ="Select * from Student order by id"; Query query = entityManager.createQuery (jql);
基於上面的查詢,JPA生成如下簡單的SQL語句:
Hibernate: select * from Student order by id
註:JQL字符串中的SQL關鍵字不區分大小寫,但是實體的名稱及其屬性是區分的(實體:Student、屬性:id)。
2.1、設置排序順序
默認情況下,排序順序是升序的,但是可以在JQL字符串中顯式設置。就像在純SQL中一樣,排序選項是asc和desc:
String jql = "Select * from Student order by id desc"; Query sortQuery = entityManager.createQuery(jql);
其生成的SQL查詢將會包括排序的升降方向:
Hibernate: select * from Student order by id desc
2.2、按兩個及以上的屬性個數排序
為瞭按多個屬性排序,會將需要排序的屬性都添加到JQL字符串的order by子句中:
String jql="Select * from Student Order by name asc,id desc"; Query sortQuery = entityManager.createQuery(jql);
同樣的排序條件將會出現在生成的SQL查詢語句中:
Hibernate: select * from Student order by name asc,id desc
註:對於多屬性排序,優先排第一個屬性,當第一個值相同時在按照第二個屬性進行排序,以此類推。
2.3、設置空值的排序優先級
默認的空值優先級是在數據庫中特定瞭的,但這可以通過HQL查詢字符串中的NULLS FIRST或NULLS LAST子句進行自定義。
舉一個簡單的示例–按Student的name屬性降序排列,並將Nulls放在末尾:
Query sortQuery = entityManager.createQuery ("Select * from Student order by name desc NULLS LAST");
那麼,其生成的SQL查詢將是如下情況:
Hibernate: select * from Student order by case when name is null then 1 else 0 end, desc
2.4、一對多關系排序
超越基本示例,現在看一個用例,該用例涉及以一對多關系對實體進行排序– Bar包含Student實體的集合。我們要對Bar實體及其Student實體的集合進行排序-JPA對於此任務特別簡單:
1、對集合進行排序:在Bar實體的Student集合上添加一個@OrderBy註解:
@OrderBy("name ASC") List <Student> studentList;
2、對包含集合的實體進行排序:
String jql = "Select * from Bar as b order by b.id"; Query barQuery = entityManager.createQuery(jql); List<Bar> barList = barQuery.getResultList();
註:此處使用瞭@OrderBy註解的原因是:我們要對每個Bar的Student集合進行排序。
接下來看一下以上JQL對應的SQL語句吧:
Hibernate: select * from Bar b order by b.id Hibernate: select * from Student slist where slist.bar_id=? order by slist.name asc
第一個查詢對父Bar實體進行排序。生成第二個查詢以對屬於Bar的子Student實體的集合進行排序。
3、使用JPA條件查詢對象API進行排序
使用JPA Criteria – orderBy方法是設置所有排序參數的“一站式”選擇:可以設置排序方向和排序依據。以下是該方法的API:
orderBy(CriteriaBuilder.asc):升序排序。 orderBy (CriteriaBuilder.desc): 降序排序。
每個Order實例都是通過CriteriaBuilder對象的asc或desc方法創建的.
這是一個簡單的示例-按名稱對Student進行排序:
CriteriaQuery<Student> criteriaQuery = criteriaBuilder.createQuery(Student.class); Root<Student> from = criteriaQuery.from(Student.class); CriteriaQuery<Student> select = criteriaQuery.select(from); criteriaQuery.orderBy(criteriaBuilder.asc(from.get("name")));
get方法的參數區分大小寫,因為它需要與屬性名稱匹配。
與簡單的JQL相反,JPA條件查詢對象API會在查詢中強制使用明確的順序方向。註意,在此代碼片段的最後一行中,criteriaBuilder對象通過調用其asc方法指定瞭升序排列。
執行上述代碼後,JPA會生成如下所示的SQL查詢。 JPA Criteria Object生成帶有顯式asc子句的SQL語句:
Hibernate: select * from Student order by asc
3.1、按兩個及以上的屬性個數排序
要對多個屬性進行排序,隻需將Order實例傳遞給orderBy方法,以對每個屬性進行排序。 這是一個簡單的示例-按名稱和ID分別按升序和降序排序:
CriteriaQuery<Student> criteriaQuery = criteriaBuilder.createQuery(Student.class); Root<Student> from = criteriaQuery.from(Student.class); CriteriaQuery<Student> select = criteriaQuery.select(from); criteriaQuery.orderBy(criteriaBuilder.asc(from.get("name")), criteriaBuilder.desc(from.get("id")));
相應的SQL查詢如下所示:
Hibernate: select * from Student order by name asc,id desc
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 全面解析JPA 倉庫repository中的findAll()方法
- jpa EntityManager 復雜查詢實例
- Spring JPA find單表查詢方法示例詳解
- Java Hibernate中的查詢策略和抓取策略
- Spring Data JPA中 in 條件參數的傳遞方式