Get!Spring Data Jpa 中竟然有 10 种默认方法前缀

小伙伴们都知道,Spring Data Jpa 有一个“神奇”的功能,就是我们只需要按照既定的规则去定义方法名,就不用自己写 SQL 了,至于具体的实现原理,松哥在 2019 年的文章中就已经介绍过了,这里就不啰嗦了(公号后台回复 2019 有当年的文章索引)。

创新互联-专业网站定制、快速模板网站建设、高性价比博州网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式博州网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖博州地区。费用合理售后完善,十年实体公司更值得信赖。

今天是想和大家捋一捋 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 {
/**
* 根据用户名查询用户
* @param username
* @return
*/
User findUserByUsername(String username);

/**
* 根据用户地址查询用户
* @param address
* @return
*/
List getUserByAddress(String address);

/**
* 查询某个日期之后出生的用户
* @param birthday
* @return
*/
List readUserByBirthdayAfter(LocalDate birthday);

/**
* 查询某个日期之前出生的用户
* @param birthday
* @return
*/
List queryUserByBirthdayBefore(LocalDate birthday);

/**
* 根据性别查询用户
* @param gender
* @return
*/
List searchUserByGender(String gender);
}

每个方法的含义我都给注释上了,这里就不啰嗦了。

需要注意的是,在 IDEA 中写的时候,前面四个都有提示,最后那个 search 没有提示,没有提示小伙伴们自己写注意可别敲错了。。

除了上面这五个常规的,还有一个稍微特殊一点的,就是 stream,其实也不算特殊,毕竟 Java 的版本一年一个样,从 JDK8 到现在都快十年了,stream 早该掌握了(还不懂 stream 的小伙伴,可以在公众号后台回复 2021,有松哥去年文章索引,去年我在 WebFlux 系列中详细介绍过 stream)。

我们来看一个 stream 的例子:

public interface UserRepository extends JpaRepository {
/**
* 根据地址查询用户,返回 stream 流
* @param address
* @return
*/
Stream 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 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 {
/**
* 统计某个地址有多少用户
* @param address
* @return
*/
Long countByAddress(String address);

/**
* 去重统计某个地址有多少用户
* @param address
* @return
*/
Long countDistinctByAddress(String address);
}

两个统计的例子,第二个是去重之后统计。

3. 判断

exists 可以用来做判断,来看个例子:

public interface UserRepository extends JpaRepository {
/**
* 判断某个地址是否存在用户
* @param address
* @return
*/
Boolean existsUserByAddress(String address);
}

4. 删除

用 delete 或者 remove 关键字可以做删除,来看两个例子:

public interface UserRepository extends JpaRepository {
/**
* 根据地址删除用户
* @param address
* @return
*/
Integer deleteUserByAddress(String address);

/**
* 根据地址删除用户
* @param address
* @return
*/
Integer removeUserByAddress(String address);
}

需要注意的是,删除的方法也是要在事务中调用。

5. 小结

好啦,这就是松哥跟大家介绍的 Spring Data Jpa 中数据库操作方法默认的 10 种前缀,当然,如果这些前缀无法满足操作,那么就可以上 @Query 注解了,这是另外一个话题了,以后聊。

分享标题:Get!Spring Data Jpa 中竟然有 10 种默认方法前缀
地址分享:http://www.gawzjz.com/qtweb/news17/209067.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联