­

芋道 Spring Boot JPA 入門(三)之基於註解查詢

  • 2019 年 12 月 13 日
  • 筆記

摘要: 原創出處 http://www.iocoder.cn/Spring-Boot/JPA/ 「芋道源碼」歡迎轉載,保留摘要,謝謝!

  • 1. 概述
  • 2. 快速入門
  • 3. 分頁操作
  • 4. 基於方法名查詢
  • 5. 基於註解查詢
  • 666. 彩蛋

5. 基於註解查詢

雖然 Spring Data JPA 提供了非常強大的功能,可以滿足絕大多數業務場景下的 CRUD 操作,但是可能部分情況下,我們可以使用在方法上添加 org.springframework.data.jpa.repository.@Query 註解,實現自定義的 SQL 操作。

如果是更新或刪除的 SQL 操作,需要額外在方法上添加 org.springframework.data.jpa.repository.@Modifying 註解。

下面,我們來編寫一個簡單的示例。

5.1 UserRepository04

cn.iocoder.springboot.lab13.mybatis.repository 包路徑下,創建 UserRepository04 介面。程式碼如下:

// UserRepository04.java    public interface UserRepository04 extends PagingAndSortingRepository<UserDO, Integer> {        @Query("SELECT u FROM UserDO u WHERE u.username = ?1")      UserDO findByUsername01(String username); // <1>        @Query("SELECT u FROM UserDO u WHERE u.username = :username")      UserDO findByUsername02(@Param("username") String username); // <2>        @Query(value = "SELECT * FROM users u WHERE u.username = :username", nativeQuery = true)      UserDO findByUsername03(@Param("username") String username); // <3>        @Query("UPDATE UserDO  u SET u.username = :username WHERE u.id = :id")      @Modifying      int updateUsernameById(Integer id, String username); // <4>    }  
  • <1> 處,使用 @Query 自定義了一個 SQL 操作,並且參數使用佔位符(`?`) + 參數位置的形式。
  • <2> 處,和 <1> 類似,差異在於使用佔位符(`:`) + 參數名字(需要使用 `@Param` 聲明)的形式。
  • <3> 處,和 <2> 類似,差別在於我們增加了 nativeQuery = true ,表示在 @Query 自定義的是原生 SQL,而非在 <1><2> 自定義的是 JPQL 。進一步的說:
    • `<1>` 和 `<2>` 處,`FROM UserDO` ,使用的是實體名。
    • `<3>` 處,使用的是表名。
    • 對 JPQL 不是很了解的胖友,可以看看 《JPQL 的學習》 文章。
  • <4> 處,定義了更新操作,需要加上 @Modifying 註解。? 另外,我們發可以現,使用參數名時,可以不用配合 @Param 註解。

5.2 簡單測試

創建 UserRepository04Test 測試類,我們來測試一下簡單的 UserRepository04 的每個操作。程式碼如下:

// UserRepository04Test.java    @RunWith(SpringRunner.class)  @SpringBootTest  public class UserRepository04Test {        @Autowired      private UserRepository04 userRepository;        @Test      public void testFindIdByUsername01() {          UserDO user = userRepository.findByUsername01("yunai");          System.out.println(user);      }        @Test      public void testFindIdByUsername02() {          UserDO user = userRepository.findByUsername02("yunai");          System.out.println(user);      }        @Test      public void testFindIdByUsername03() {          UserDO user = userRepository.findByUsername03("yunai");          System.out.println(user);      }        @Test      // 更新操作,需要在事務中。      // 在單元測試中,事務默認回滾,所以胖友可能怎麼測試,事務都不更新。      @Transactional      public void testUpdateUsernameById() {          userRepository.updateUsernameById(5, "yudaoyuanma");      }    }  

具體的,胖友可以自己跑跑,妥妥的。

對於分頁操作,需要在 @Query 編寫查詢分頁列表和記錄總數兩條 SQL 。示例如下:

public interface UserRepository extends JpaRepository<User, Long> {      @Query(value = "SELECT * FROM USERS WHERE LASTNAME = ?1", // value 屬性,編寫查詢分頁列表的 SQL 。      countQuery = "SELECT count(*) FROM USERS WHERE LASTNAME = ?1", // countQuery 屬性,編寫記錄總數的 SQL 。      nativeQuery = true)    Page<User> findByLastname(String lastname, Pageable pageable);    }  

666. 彩蛋

? 本文僅僅是 Spring Data JPA 的簡單入門,還有部分內容,胖友可以自己在去學習下:

  • 《Using JPA Named Queries》 ,可以使用 XML 自定義 SQL 操作。
  • 《Spring Data JPA 實現邏輯刪除》 ,絕大多數業務場景下,我們不會使用 DELETE 物理刪除,而是通過標誌位進行邏輯刪除。
  • 多表查詢
    • 方式一:《JPA 多表查詢的解決辦法》
    • 方式二:《JPA 多表關聯查詢》
  • 《Spring Data JPA 使用 Example 快速實現動態查詢》 艿艿,如果在這種情況下,Repository 需要繼承 JpaRepository 介面。

如果胖友想找一個完整的,使用 JPA 的項目,可以看看 Apollo 。它是攜程開源的配置中心,目前最好用的配置中心,基本沒有之一,嘿嘿。

推薦閱讀:

  • 《性能測試 —— MySQL 基準測試》
  • 《芋道 Spring Boot 多數據源(讀寫分離)入門》 對應 lab-17 。
  • 《芋道 Spring Boot 分庫分表入門》 對應 lab-18 。