日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Get!Spring Data Jpa 中竟然有 10 種默認(rèn)方法前綴

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

創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比博州網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式博州網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋博州地區(qū)。費(fèi)用合理售后完善,十年實(shí)體公司更值得信賴。

今天是想和大家捋一捋 Spring Data Jpa 所支持的方法前綴問題。

我們?nèi)粘i_發(fā)中,如果用到了 Spring Data Jpa,用的最多的就是 findXXX 了,有的人可能是用 getXXX 或者 readXXX,我覺得這幾個(gè)是用的最多的幾個(gè)了,其實(shí) 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";

接下來松哥舉幾個(gè)例子我們一起來捋一捋。如果小伙伴們對 Spring Data Jpa 處于從來沒用過的狀態(tài),那么可以在公眾號后臺回復(fù) 666,松哥在之前的 Spring Boot 教程中介紹過,可以先學(xué)習(xí)下,否則學(xué)習(xí)本文可能會有點(diǎn)摸不著頭腦。

1. 查詢

先來看查詢。

find/get/read/query/search 都算是常規(guī)前綴,我們來看幾個(gè)例子:

public interface UserRepository extends JpaRepository {
/**
* 根據(jù)用戶名查詢用戶
* @param username
* @return
*/
User findUserByUsername(String username);

/**
* 根據(jù)用戶地址查詢用戶
* @param address
* @return
*/
List getUserByAddress(String address);

/**
* 查詢某個(gè)日期之后出生的用戶
* @param birthday
* @return
*/
List readUserByBirthdayAfter(LocalDate birthday);

/**
* 查詢某個(gè)日期之前出生的用戶
* @param birthday
* @return
*/
List queryUserByBirthdayBefore(LocalDate birthday);

/**
* 根據(jù)性別查詢用戶
* @param gender
* @return
*/
List searchUserByGender(String gender);
}

每個(gè)方法的含義我都給注釋上了,這里就不啰嗦了。

需要注意的是,在 IDEA 中寫的時(shí)候,前面四個(gè)都有提示,最后那個(gè) search 沒有提示,沒有提示小伙伴們自己寫注意可別敲錯(cuò)了。。

除了上面這五個(gè)常規(guī)的,還有一個(gè)稍微特殊一點(diǎn)的,就是 stream,其實(shí)也不算特殊,畢竟 Java 的版本一年一個(gè)樣,從 JDK8 到現(xiàn)在都快十年了,stream 早該掌握了(還不懂 stream 的小伙伴,可以在公眾號后臺回復(fù) 2021,有松哥去年文章索引,去年我在 WebFlux 系列中詳細(xì)介紹過 stream)。

我們來看一個(gè) stream 的例子:

public interface UserRepository extends JpaRepository {
/**
* 根據(jù)地址查詢用戶,返回 stream 流
* @param address
* @return
*/
Stream findUserByAddress(String address);
}

返回值是一個(gè) stream 流即可。

這里有一個(gè)需要注意的地方,就是調(diào)用返回值為 stream 流的方法時(shí),需要加事務(wù),如果不加事務(wù),會報(bào)如下錯(cuò)誤:

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.

這個(gè)錯(cuò)誤的意思很明確,就是你要把 stream 查詢放到一個(gè)事務(wù)中,進(jìn)而確保 stream 操作是數(shù)據(jù)庫連接沒有關(guān)閉。因?yàn)?stream 中并不保存數(shù)據(jù),所以要是 Connection 關(guān)閉了,就沒法操作數(shù)據(jù)了。

松哥給大家看一個(gè)簡單的 stream 方法調(diào)用案例:

@Autowired
UserRepository userRepository;
@Test
@Transactional(readOnly = true)
void test01() {
List list = 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)計(jì)

count 關(guān)鍵字可以用來做統(tǒng)計(jì),來看下面一個(gè)例子:

public interface UserRepository extends JpaRepository {
/**
* 統(tǒng)計(jì)某個(gè)地址有多少用戶
* @param address
* @return
*/
Long countByAddress(String address);

/**
* 去重統(tǒng)計(jì)某個(gè)地址有多少用戶
* @param address
* @return
*/
Long countDistinctByAddress(String address);
}

兩個(gè)統(tǒng)計(jì)的例子,第二個(gè)是去重之后統(tǒng)計(jì)。

3. 判斷

exists 可以用來做判斷,來看個(gè)例子:

public interface UserRepository extends JpaRepository {
/**
* 判斷某個(gè)地址是否存在用戶
* @param address
* @return
*/
Boolean existsUserByAddress(String address);
}

4. 刪除

用 delete 或者 remove 關(guān)鍵字可以做刪除,來看兩個(gè)例子:

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 注解了,這是另外一個(gè)話題了,以后聊。


當(dāng)前名稱:Get!Spring Data Jpa 中竟然有 10 種默認(rèn)方法前綴
當(dāng)前地址:http://www.5511xx.com/article/dpieicd.html