自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Get!Spring Data Jpa 中竟然有 10 種默認(rèn)方法前綴

開發(fā) 前端
我一直覺得 Spring Data Jpa 用的少,沒想到最近有好幾個小伙伴問 Jpa 的問題,想了想,我就把我知道的關(guān)于 Jpa 的一些知識點,整理一下文章和大家分享下,今天就先來看個簡單的。

我一直覺得 Spring Data Jpa 用的少,沒想到最近有好幾個小伙伴問 Jpa 的問題,想了想,我就把我知道的關(guān)于 Jpa 的一些知識點,整理一下寫幾篇文章和大家分享下,今天就先來看個簡單的。

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

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

我們?nèi)粘i_發(fā)中,如果用到了 Spring Data Jpa,用的最多的就是 findXXX 了,有的人可能是用 getXXX 或者 readXXX,我覺得這幾個是用的最多的幾個了,其實 Spring Data Jpa 支持的方法前綴多達 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<User,Integer> {
/**
* 根據(jù)用戶名查詢用戶
* @param username
* @return
*/
User findUserByUsername(String username);

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

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

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

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

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

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

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

我們來看一個 stream 的例子:

public interface UserRepository extends JpaRepository<User,Integer> {
/**
* 根據(jù)地址查詢用戶,返回 stream 流
* @param address
* @return
*/
Stream<User> findUserByAddress(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ù)中,進而確保 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() {
List<User> 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)計

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

public interface UserRepository extends JpaRepository<User,Integer> {
/**
* 統(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<User,Integer> {
/**
* 判斷某個地址是否存在用戶
* @param address
* @return
*/
Boolean existsUserByAddress(String address);
}

4. 刪除

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

public interface UserRepository extends JpaRepository<User,Integer> {
/**
* 根據(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 注解了,這是另外一個話題了,以后聊。

責(zé)任編輯:武曉燕 來源: 江南一點雨
相關(guān)推薦

2021-07-05 18:05:40

SpringBean方法

2020-07-07 07:37:36

Integer源碼Java

2020-11-03 06:57:10

MyBatis數(shù)據(jù)庫

2019-09-18 15:20:16

MyBatisSQL數(shù)據(jù)庫

2020-11-27 09:16:21

BlockingQue

2022-09-04 12:43:03

算法裁員Meta

2012-03-06 11:25:40

ibmdw

2019-06-14 08:48:46

Tomcat日志SpringBoot

2021-10-06 23:31:45

HibernateJPASpring Data

2021-05-07 05:34:25

Windows10操作系統(tǒng)微軟

2015-07-20 15:26:56

WiFi感知

2013-09-22 10:15:01

Spring DataJPA

2022-04-28 08:05:05

數(shù)據(jù)庫數(shù)據(jù)庫交互

2021-12-08 08:30:55

Java AQS機制 Java 基礎(chǔ)

2009-06-01 12:04:38

JPASpringJAVA

2021-02-03 20:19:08

Istio流量網(wǎng)格

2016-06-07 09:23:05

瀏覽器技巧快捷鍵

2009-06-18 15:28:08

Glassfish JSpring

2017-03-07 17:45:42

Windows磁盤碎片整理

2018-06-15 14:28:36

華為云
點贊
收藏

51CTO技術(shù)棧公眾號