新聞中心
小伙伴們都知道,Spring Data Jpa 有一個“神奇”的功能,就是我們只需要按照既定的規(guī)則去定義方法名,就不用自己寫 SQL 了,至于具體的實現(xiàn)原理,松哥在 2019 年的文章中就已經(jīng)介紹過了,這里就不啰嗦了(公號后臺回復(fù) 2019 有當(dāng)年的文章索引)。

創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比博州網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式博州網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋博州地區(qū)。費用合理售后完善,十年實體公司更值得信賴。
今天是想和大家捋一捋 Spring Data Jpa 所支持的方法前綴問題。
我們?nèi)粘i_發(fā)中,如果用到了 Spring Data Jpa,用的最多的就是 findXXX 了,有的人可能是用 getXXX 或者 readXXX,我覺得這幾個是用的最多的幾個了,其實 Spring Data Jpa 支持的方法前綴多達(dá) 11 種,我們來瞅瞅:
相關(guān)的源碼在 org.springframework.data.repository.query.parser.PartTree 類中:
private static final String QUERY_PATTERN = "find|read|get|query|search|stream";
private static final String COUNT_PATTERN = "count";
private static final String EXISTS_PATTERN = "exists";
private static final String DELETE_PATTERN = "delete|remove";
接下來松哥舉幾個例子我們一起來捋一捋。如果小伙伴們對 Spring Data Jpa 處于從來沒用過的狀態(tài),那么可以在公眾號后臺回復(fù) 666,松哥在之前的 Spring Boot 教程中介紹過,可以先學(xué)習(xí)下,否則學(xué)習(xí)本文可能會有點摸不著頭腦。
1. 查詢
先來看查詢。
find/get/read/query/search 都算是常規(guī)前綴,我們來看幾個例子:
public interface UserRepository extends JpaRepository{
/**
* 根據(jù)用戶名查詢用戶
* @param username
* @return
*/
User findUserByUsername(String username);
/**
* 根據(jù)用戶地址查詢用戶
* @param address
* @return
*/
ListgetUserByAddress(String address);
/**
* 查詢某個日期之后出生的用戶
* @param birthday
* @return
*/
ListreadUserByBirthdayAfter(LocalDate birthday);
/**
* 查詢某個日期之前出生的用戶
* @param birthday
* @return
*/
ListqueryUserByBirthdayBefore(LocalDate birthday);
/**
* 根據(jù)性別查詢用戶
* @param gender
* @return
*/
ListsearchUserByGender(String gender);
}
每個方法的含義我都給注釋上了,這里就不啰嗦了。
需要注意的是,在 IDEA 中寫的時候,前面四個都有提示,最后那個 search 沒有提示,沒有提示小伙伴們自己寫注意可別敲錯了。。
除了上面這五個常規(guī)的,還有一個稍微特殊一點的,就是 stream,其實也不算特殊,畢竟 Java 的版本一年一個樣,從 JDK8 到現(xiàn)在都快十年了,stream 早該掌握了(還不懂 stream 的小伙伴,可以在公眾號后臺回復(fù) 2021,有松哥去年文章索引,去年我在 WebFlux 系列中詳細(xì)介紹過 stream)。
我們來看一個 stream 的例子:
public interface UserRepository extends JpaRepository{
/**
* 根據(jù)地址查詢用戶,返回 stream 流
* @param address
* @return
*/
StreamfindUserByAddress(String address);
}
返回值是一個 stream 流即可。
這里有一個需要注意的地方,就是調(diào)用返回值為 stream 流的方法時,需要加事務(wù),如果不加事務(wù),會報如下錯誤:
org.springframework.dao.InvalidDataAccessApiUsageException: You're trying to execute a streaming query method without a surrounding transaction that keeps the connection open so that the Stream can actually be consumed. Make sure the code consuming the stream uses @Transactional or any other way of declaring a (read-only) transaction.
這個錯誤的意思很明確,就是你要把 stream 查詢放到一個事務(wù)中,進(jìn)而確保 stream 操作是數(shù)據(jù)庫連接沒有關(guān)閉。因為 stream 中并不保存數(shù)據(jù),所以要是 Connection 關(guān)閉了,就沒法操作數(shù)據(jù)了。
松哥給大家看一個簡單的 stream 方法調(diào)用案例:
@Autowired
UserRepository userRepository;
@Test
@Transactional(readOnly = true)
void test01() {
Listlist = userRepository.findUserByAddress("深圳").map(u -> {
u.setAddress("中國 " + u.getAddress());
return u;
}).collect(Collectors.toList());
System.out.println("list = " + list);
}
從數(shù)據(jù)庫中查詢到數(shù)據(jù)之后,給所有的 address 都加上"中國"二字。
2. 統(tǒng)計
count 關(guān)鍵字可以用來做統(tǒng)計,來看下面一個例子:
public interface UserRepository extends JpaRepository{
/**
* 統(tǒng)計某個地址有多少用戶
* @param address
* @return
*/
Long countByAddress(String address);
/**
* 去重統(tǒng)計某個地址有多少用戶
* @param address
* @return
*/
Long countDistinctByAddress(String address);
}
兩個統(tǒng)計的例子,第二個是去重之后統(tǒng)計。
3. 判斷
exists 可以用來做判斷,來看個例子:
public interface UserRepository extends JpaRepository{
/**
* 判斷某個地址是否存在用戶
* @param address
* @return
*/
Boolean existsUserByAddress(String address);
}
4. 刪除
用 delete 或者 remove 關(guān)鍵字可以做刪除,來看兩個例子:
public interface UserRepository extends JpaRepository{
/**
* 根據(jù)地址刪除用戶
* @param address
* @return
*/
Integer deleteUserByAddress(String address);
/**
* 根據(jù)地址刪除用戶
* @param address
* @return
*/
Integer removeUserByAddress(String address);
}
需要注意的是,刪除的方法也是要在事務(wù)中調(diào)用。
5. 小結(jié)
好啦,這就是松哥跟大家介紹的 Spring Data Jpa 中數(shù)據(jù)庫操作方法默認(rèn)的 10 種前綴,當(dāng)然,如果這些前綴無法滿足操作,那么就可以上 @Query 注解了,這是另外一個話題了,以后聊。
分享名稱:Get!Spring Data Jpa 中竟然有 10 種默認(rèn)方法前綴
網(wǎng)頁地址:http://fisionsoft.com.cn/article/dpieicd.html


咨詢
建站咨詢
