Spring Boot 入門系列(二十七)使用Spring Data JPA 自定義查詢如此簡單,完全不需要寫SQL!

章為忠 發表於 2021-09-14
Spring SQL

前面講了Spring Boot 整合Spring Boot JPA,實現JPA 的增、刪、改、查的功能。JPA使用非常簡單,只需繼承JpaRepository ,無需任何資料訪問層和sql語句即可實現完整的資料操作方法。JPA除了這些功能和優勢之外,還有非常強大的查詢的功能。以前複查的查詢都需要拼接很多查詢條件,JPA 有非常方便和優雅的方式來解決。接下來就聊一聊JPA 自定義查詢,體驗Spring Data JPA 的強大。

Spring Data JPA 查詢分為兩種,一種是 Spring Data JPA 預設實現的預定義的方法,另一種是需要根據查詢的情況定義查詢條件。  

 

一、預定義查詢

預定義方法就是我們上面看到的那些自帶的方法,因為UserRepository繼承了 JpaRepository 擁有了父類的這些JPA自帶的方法。如下圖所示:

Spring Boot 入門系列(二十七)使用Spring Data JPA 自定義查詢如此簡單,完全不需要寫SQL!

 

 

呼叫預定義方法:

@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 等。

這個語句結構可以用下面的表來說明:

Spring Boot 入門系列(二十七)使用Spring Data JPA 自定義查詢如此簡單,完全不需要寫SQL!

 

三、自定義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 的屬性即可。