之前介紹了SpringBoot整合Jpa的簡單使用,接下來介紹一下使用Jpa連線資料庫對資料進行排序、分頁、條件查詢和過濾操作。首先建立Springboot工程並已經繼承JPA依賴,如果不知道可以檢視我的另一篇文進行學習,這裡不做介紹。文章地址(https://www.cnblogs.com/eternality/p/17391141.html)
1、排序查詢
透過findAll方法的Sort類進行排序,根據實體類欄位進行排序。descending降序,ascending升序,預設不填為ascending升序。
List<User> mapperAll = userMapper.findAll(Sort.by("id").descending());
mapperAll.forEach(System.out::println);
查詢結果:
Sort.by() 裡面是一個可變引數,可以傳入一個或多個值。
//先根據狀態進行排序,然後在根據ID進行排序 List<User> statusAll = userMapper.findAll(Sort.by("status","id").descending()); statusAll.forEach(System.out::println);
設定第一個屬性降序,第二個屬性升序
Sort sort = Sort.by("status").descending().and(Sort.by("id").ascending()); List<User> diffOb= userMapper.findAll(sort); diffOb.forEach(System.out::println);
如果傳入的欄位資訊,實體類中沒有,程式碼訪問會報錯。如:
List<User> exceptionAll = userMapper.findAll(Sort.by("en_name").descending());
exceptionAll.forEach(System.out::println);
會報找不到該欄位資訊異常:
org.springframework.data.mapping.PropertyReferenceException: No property en found for type User! Did you mean 'id'?
2、分頁查詢
JPA為我們提供了分頁的方法,我們可以檢視介面整合的JpaRepository介面的關係圖。發現有一個PagingAndSortingRepository介面。
點選該介面進行檢視:
使用這個介面方法就可以實現分頁查詢了。我們發現這個方法需要傳入一個Pageable,點選Pageable檢視發現它也是一個介面我們點選檢視它的實現類。
使用PageRequest類就可以實現分頁了,PageRequest有個靜態的of方法,page引數為顯示當前頁數,size為顯示當前顯示多少資料.
//第一頁,顯示4條資料 0為一頁 1為二頁 輸入頁數大於總頁數則輸出內容為空 PageRequest request = PageRequest.of(0, 4); Page<User> userPage = userMapper.findAll(request); System.out.println(); System.out.println("總頁數: "+userPage.getTotalPages()); //總頁數 System.out.println("總條數: "+userPage.getTotalElements()); //總條數 System.out.println("查詢的資料: "+userPage.getContent());//查詢的資料 System.out.println("顯示條數: "+userPage.getSize()); //顯示條數 System.out.println("當前頁數: "+Integer.valueOf(Integer.valueOf(userPage.getNumber())+1)); //當前頁數
查詢結果為:
還可以給分頁查詢進行排序,根據主鍵進行降序排序
PageRequest pageRequest = PageRequest.of(0, 4, Sort.by("id").descending()); Page<User> orderPAge = userMapper.findAll(pageRequest); System.out.println("查詢的資料: "+orderPAge.getContent());//查詢的資料 orderPAge.getContent().forEach(System.out::println);
分頁進行多個欄位的排序同一排序
PageRequest pageRequest1 = PageRequest.of(0, 4, Sort.Direction.DESC, "status","id"); Page<User> orde = userMapper.findAll(pageRequest1); System.out.println("查詢的資料: "+orde.getContent());//查詢的資料 orde.getContent().forEach(System.out::println);
分頁進行多個欄位的不同排序 根據status 升序,id降序排序
PageRequest of = PageRequest.of(0, 4, Sort.by("status").ascending().and(Sort.by("id").descending())); Page<User> ord = userMapper.findAll(of); ord.getContent().forEach(System.out::println);
檢視查詢輸出sql結果:
3、條件查詢
下面我們來看使用JPA進行條件查詢。在JPA中JPA使用findBy方法自定義查詢。也可以使用findAllBy。這兩個沒有區別實際上還是使用的finBy...進行查詢的。
//根據賬號名稱進行查詢,有資訊放回該條資料,沒有查詢到則放回null,如果查詢多條資料則會報錯 User user=userMapper.findByAccount("hibernateTest");
//Dao層
User findByAccount(String account);
如果查詢多條會報錯javax.persistence.NonUniqueResultException: query did not return a unique result: 4,把接收引數改為List,就可以查詢多條資料了。
List<User> findByAccount(String account);
findBy後面還可以支援多種關鍵詞進行查詢:
And:等價於SQL中的 and 關鍵字, findByAccountAndPassword(String account, String password);
And:等價於SQL中的 and 關鍵字,findByAccountAndPassword(String account, String password);
Or:等價於SQL中的 or 關鍵字, findByAccountOrName(String account, String name);
Between:等價於SQL中的 between 關鍵字,findByIdBetween(int min, int max);
LessThan:等價於 SQL 中的 "<",findByIdLessThan(int id);
GreaterThan:等價於 SQL 中的">",findByIdGreaterThan(int id);
IsNull:等價於 SQL 中的 "is null",findByNameIsNull();
IsNotNull:等價於 SQL 中的 "is not null",findByNameIsNotNull();NotNull:與 IsNotNull 等價;
Like:等價於 SQL 中的 "like",findByNameLike(String name);這樣傳值需要加 %name%,可以使用Containing,這個方法會在字串兩邊都加上%,
除此之外還有StartingWith 和EndingWith,分別為 ?%,%?
NotLike:等價於 SQL 中的 "not like",findByNameNotLike(String name);傳值需要加 %name%
Not:等價於 SQL 中的 "!=",findByUsernameNot(String user);
OrderBy:等價於 SQL 中的 "order by",findByNameOrderByStatusAsc(String name);
In:等價於 SQL 中的 "in",findByIdIn(Collection userIdList) ,方法的引數可以是 Collection 型別,也可以是陣列或者不定長引數;
NotIn:等價於 SQL 中的 "not in",findByNameNotIn(Collection userList) ,方法的引數可以是 Collection 型別,也可以是陣列或者不定長引數;
這裡介紹一下模糊查詢使用方法:
List<User> userList2=userMapper.findByNameLike("%hibernateTest%"); userList2.forEach(System.out::println); List<User> userList3=userMapper.findByNameContaining("hibernateTest"); userList3.forEach(System.out::println);
//dao層
List<User> findByNameLike(String name);
List<User> findByNameContaining(String name);
上面的findBy規則介紹完畢後,接下來我們結合上面的分頁和排序,查詢出過濾後的資料。條件+分頁+排序查詢使用:
Page<User> userPage = userMapper.findByNameLike("%hibernateJPa%", PageRequest.of(0, 2, Sort.by("id").descending())); System.out.println("總頁數: "+userPage.getTotalPages()); //總頁數 System.out.println("總條數: "+userPage.getTotalElements()); //總條數 System.out.println("查詢的資料: "+userPage.getContent());//查詢的資料 System.out.println("顯示條數: "+userPage.getSize()); //顯示條數 System.out.println("當前頁數: "+Integer.valueOf(Integer.valueOf(userPage.getNumber())+1)); //當前頁數
//dao層
Page<User> findByNameLike(String name, Pageable pageable);
查詢結果:
使用JPA進行查詢、排序和分頁我們就介紹完畢了。關於JPA後面還有複雜的sql條件查詢,需要繼承JpaSpecificationExecutor介面。JpaSpecificationExecutor介面方法不多但是很好用,推薦大家有時間可以學習一下。