天天看點

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測試類:

SpringBoot--jpa之Sort查詢背景:

官網給的例子竟然deprecated了。。why?

分析一下。。。

所有的排序,都有一種順序,我們把它定義為大或者小,兒Sort隻有一個參數的構造器是沒有傳遞大小的排序規則的

進入源碼分析:

SpringBoot--jpa之Sort查詢背景:
原來是有一個預設的排序規則

public static final Direction DEFAULT_DIRECTION = Direction.ASC;

預設是升序的規則,為什麼廢棄調沒有排序規則的這個構造方法,可能作者認為在排序的時候就如你寫SQL時一樣,必須指定規則,是以,一定有個構造方法是指定了排序規則和要排序的字段。

是以就有了:

SpringBoot--jpa之Sort查詢背景:

又或者:

SpringBoot--jpa之Sort查詢背景:

用實體之外的字段對查詢結果排序

除了對查詢實體的字段進行排序,我們可能會有這樣的需求:

比如:用實體中的某個字段的長度進行排序

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

這樣看起來順利成章,運作一下

SpringBoot--jpa之Sort查詢背景:

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

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

運作結果:

SpringBoot--jpa之Sort查詢背景:

繼續閱讀