SpringBoot--jpa之Sort查詢
阿新 • • 發佈:2018-12-19
背景:
在操作資料上,我們可能要對資料進行排序,比如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)")));
}
執行結果: