1. 程式人生 > >SpringBoot--jpa之Sort查詢

SpringBoot--jpa之Sort查詢

背景:

在操作資料上,我們可能要對資料進行排序,比如SQL語句中的OrderBy等,在JPQL中,在查詢語句中傳入Sort類相關屬性即可得到相應的結果。

程式碼演示:

在傳入引數的時候,你可以new例項化Sort類,在構造器中傳入相應的排序規則和要排序的屬性,程式碼: Dao

  @Query("SELECT p FROM Person p WHERE p.firstName LIKE %?1%")
   public List<Person> findPersonBySort(String userName, Sort sort);

Dao測試類:

dao.findPersonBySort
("ta", new Sort("firstname"))

在這裡插入圖片描述

官網給的例子竟然deprecated了。。why? 分析一下。。。

所有的排序,都有一種順序,我們把它定義為大或者小,兒Sort只有一個引數的構造器是沒有傳遞大小的排序規則的 進入原始碼分析: 在這裡插入圖片描述 原來是有一個預設的排序規則 public static final Direction DEFAULT_DIRECTION = Direction.ASC; 預設是升序的規則,為什麼廢棄調沒有排序規則的這個構造方法,可能作者認為在排序的時候就如你寫SQL時一樣,必須指定規則,所以,一定有個構造方法是指定了排序規則和要排序的欄位。

所以就有了: 在這裡插入圖片描述

又或者: 在這裡插入圖片描述

用實體之外的欄位對查詢結果排序

除了對查詢實體的欄位進行排序,我們可能會有這樣的需求: 比如:用實體中的某個欄位的長度進行排序

@Test
 public void getPersonBySort() {
     System.out.println(dao.findPersonBySort("ta", Sort.by(Sort.Direction.ASC, "LENGTH(lastName)")));
 }

這樣看起來順利成章,執行一下

org.springframework.dao.InvalidDataAccessApiUsageException: Sort expression 'LENGTH(lastName): ASC'
must only contain property references or aliases used in the select clause. If you really want to use something other than that for sorting, please use JpaSort.unsafe()!

在這裡插入圖片描述

拋異常了。。。異常資訊中也告訴我們不能這樣用,正確的開啟方式應該是:

@Test
 public void getPersonBySort() {
     System.out.println(dao.findPersonBySort("ta", JpaSort.unsafe(Sort.Direction.ASC, "LENGTH(lastName)")));
 }

執行結果: 在這裡插入圖片描述