成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Get!Spring Data Jpa 中竟然有 10 種默認方法前綴

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

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

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

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

我們日常開發中,如果用到了 Spring Data Jpa,用的最多的就是 findXXX 了,有的人可能是用 getXXX 或者 readXXX,我覺得這幾個是用的最多的幾個了,其實 Spring Data Jpa 支持的方法前綴多達 11 種,我們來瞅瞅:

相關的源碼在 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 處于從來沒用過的狀態,那么可以在公眾號后臺回復 666,松哥在之前的 Spring Boot 教程中介紹過,可以先學習下,否則學習本文可能會有點摸不著頭腦。

1. 查詢

先來看查詢。

find/get/read/query/search 都算是常規前綴,我們來看幾個例子:

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

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

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

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

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

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

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

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

我們來看一個 stream 的例子:

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

返回值是一個 stream 流即可。

這里有一個需要注意的地方,就是調用返回值為 stream 流的方法時,需要加事務,如果不加事務,會報如下錯誤:

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 查詢放到一個事務中,進而確保 stream 操作是數據庫連接沒有關閉。因為 stream 中并不保存數據,所以要是 Connection 關閉了,就沒法操作數據了。

松哥給大家看一個簡單的 stream 方法調用案例:

@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);
}

從數據庫中查詢到數據之后,給所有的 address 都加上"中國"二字。

2. 統計

count 關鍵字可以用來做統計,來看下面一個例子:

public interface UserRepository extends JpaRepository<User,Integer> {
/**
* 統計某個地址有多少用戶
* @param address
* @return
*/
Long countByAddress(String address);

/**
* 去重統計某個地址有多少用戶
* @param address
* @return
*/
Long countDistinctByAddress(String address);
}

兩個統計的例子,第二個是去重之后統計。

3. 判斷

exists 可以用來做判斷,來看個例子:

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

4. 刪除

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

public interface UserRepository extends JpaRepository<User,Integer> {
/**
* 根據地址刪除用戶
* @param address
* @return
*/
Integer deleteUserByAddress(String address);

/**
* 根據地址刪除用戶
* @param address
* @return
*/
Integer removeUserByAddress(String address);
}

需要注意的是,刪除的方法也是要在事務中調用。

5. 小結

好啦,這就是松哥跟大家介紹的 Spring Data Jpa 中數據庫操作方法默認的 10 種前綴,當然,如果這些前綴無法滿足操作,那么就可以上 @Query 注解了,這是另外一個話題了,以后聊。

責任編輯:武曉燕 來源: 江南一點雨
相關推薦

2021-07-05 18:05:40

SpringBean方法

2020-07-07 07:37:36

Integer源碼Java

2020-11-03 06:57:10

MyBatis數據庫

2019-09-18 15:20:16

MyBatisSQL數據庫

2020-11-27 09:16:21

BlockingQue

2022-09-04 12:43:03

算法裁員Meta

2019-06-14 08:48:46

Tomcat日志SpringBoot

2012-03-06 11:25:40

ibmdw

2021-05-07 05:34:25

Windows10操作系統微軟

2021-10-06 23:31:45

HibernateJPASpring Data

2015-07-20 15:26:56

WiFi感知

2013-09-22 10:15:01

Spring DataJPA

2022-04-28 08:05:05

數據庫數據庫交互

2021-12-08 08:30:55

Java AQS機制 Java 基礎

2009-06-01 12:04:38

JPASpringJAVA

2021-02-03 20:19:08

Istio流量網格

2016-06-07 09:23:05

瀏覽器技巧快捷鍵

2017-03-07 17:45:42

Windows磁盤碎片整理

2009-06-18 15:28:08

Glassfish JSpring

2018-06-15 14:28:36

華為云
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 妹子干综合| 精品一区二区三区视频在线观看 | 欧美精品一区二区在线观看 | 欧洲性生活视频 | 日韩一级精品视频在线观看 | 欧美综合久久久 | 国产精品永久免费观看 | 日韩欧美在线一区 | 青青久久久 | 国产在线视频一区 | 久久精品16 | 久久久激情视频 | 97高清国语自产拍 | 国产真实精品久久二三区 | av天天干 | 国产综合av | 国产精品区一区二区三 | 中国xxxx性xxxx产国 | 亚洲男人天堂av | 五月天天色 | 欧美黄色片 | 久久久久久久国产精品 | 日韩成人在线电影 | 一区二区三区网站 | 中文字幕视频一区二区 | 日韩欧美一级 | 国产精品成人一区二区三区夜夜夜 | 日日操夜夜干 | 精品国产久 | 精品乱码一区二区三四区视频 | 精品一区二区三区免费视频 | 精品久久久久久久久久久久久久久久久 | 国产高清精品一区二区三区 | 久久国产一区二区三区 | 人人精品 | 97视频精品 | 日本超碰 | 国产高清免费视频 | 免费精品一区 | 成人精品国产免费网站 | 成人国产精品免费观看 |