芋道 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 。