前面講了Spring Boot 整合Spring Boot JPA,實現JPA 的增、刪、改、查的功能。JPA使用非常簡單,只需繼承JpaRepository ,無需任何資料訪問層和sql語句即可實現完整的資料操作方法。JPA除了這些功能和優勢之外,還有非常強大的查詢的功能。以前複查的查詢都需要拼接很多查詢條件,JPA 有非常方便和優雅的方式來解決。接下來就聊一聊JPA 自定義查詢,體驗Spring Data JPA 的強大。
Spring Data JPA 查詢分為兩種,一種是 Spring Data JPA 預設實現的預定義的方法,另一種是需要根據查詢的情況定義查詢條件。
一、預定義查詢
預定義方法就是我們上面看到的那些自帶的方法,因為UserRepository繼承了 JpaRepository 擁有了父類的這些JPA自帶的方法。如下圖所示:
呼叫預定義方法:
@RequestMapping("/test") public void test() { Users user = new Users(); user.setId((long) 1); userRespository.findById((long) 1); userRespository.findAll(); userRespository.delete(user); userRespository.deleteById((long) 1); userRespository.existsById((long) 1); }
上面所有JpaRepository父類擁有的方法都可以直接呼叫 。
二、自定義查詢
Spring Data JPA 支援根據實體的某個屬性實現資料庫操作,主要的語法是 findByXX、 readAByXX、queryByXX、 countByXX、 getByXX 後跟屬性名稱,利用這個功能僅需要在定義的 Repository 中新增對應的方法名即可,無需具體實現完整的方法,使用時 Spring Boot 會自動動幫我們實現對應的sql語句。
1、屬性查詢
根據姓名查詢,示例如下:
@Repository public interface UserRespository extends JpaRepository<Users, Long> { Users findByName(String name,String account); }
上面的例項可以看到,我們可以在UserRepository 介面中進行介面宣告。例如,如果想根據實體的 name和account 這兩個屬性來進行查詢User的資訊。那麼直接在 UserRepository 中增加一個介面宣告即可。
2、組合條件查詢
JPA不僅支援單個屬性查詢,還能支援多個屬性,根據And、or 等關鍵字組合查詢:
Users findByNameAndAccount(String name,String account);
上面的例子,就是根據姓名和賬號兩個條件組合查詢。這個是組合查詢的例子,刪除和統計也是類似的:deleteByXXXAndXXX、countByXXXAndXXX。可以根據查詢的條件不斷地新增和拼接, Spring Boot 都可以正確解析和執行。
3、JPA關鍵字
JPA的自定義查詢除了And、or 關鍵字外,基本上SQL語法中的關鍵字,JPA都支援,比如:like,between 等。
這個語句結構可以用下面的表來說明:
三、自定義SQL語句
上面介紹了JPA的很多條件查詢的方法。但是,實際專案中,還是有些場景上面的查詢條件無法滿足。那麼我們就可以通過 @Query 註解寫hql 來實現。
@Query("select u from Users u where u.name = :name1") List<UserDO> findByHql(@Param("name1") String name1);
說明:
1、@Query 註解,表示用執行hql語句。
2、name1等引數對應定義的引數。
上面是通過hql,如果hql 寫著不習慣,也可以用本地 SQL 語句來完成查詢:
@Query(value = "select * from users where name = ?1",nativeQuery = true) List<User> findUserBySql(String name);
上面示例中的 ?1 表示方法引數中的順序,nativeQuery = true 表示執行原生sql語句。
最後
以上就把Spring Data JPA的查詢功能介紹完了, JPA 簡化了我們對資料庫的操作,預定義很多常用的資料庫方法,直接使用即可。另外 JPA 還有一個特點,就是不用關心資料庫的表結構,需要更改的時候只需要修改對應 Model 的屬性即可。