我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JPA-JpaRepository方法命名语法说明

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JPA-JpaRepository方法命名语法说明

前言

梳理了一遍JPA的方法命名语法,记录一下,以便后续备查。

注:本文不介绍JPL语法,版本为spring-data-jpa-2.3.0.RELEASE。

假设实体类名为 aaa,且定义如下:


import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
@Data
public class aaa {
    @Id
    private long id;
    private long restId;
    private int dishHour;
    private int num;
}

对应的仓储层接口定义:


import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import javax.transaction.Transactional;
import java.util.List;
@Repository
public interface aaaRepository extends JpaRepository<aaa, Long> {
    int countByDishHourAndRestId(int hour, long restId);
    boolean existsByDishHourAndRestId(int hour, long restId);
    List<aaa> findByDishHourAndRestId(int hour, long restId);
    aaa findTopByDishHourAndRestId(int hour, long restId);
    @Transactional
    int deleteByDishHourAndRestId(int hour, long restId);
}

JPA的语法分为如下5种:

1、count相关,返回值为int 或 long


int countByDishHourAndRestId(int hour, long restId);
int countaaaByDishHourAndRestId(int hour, long restId);
int countaaasByDishHourAndRestId(int hour, long restId);
int countAllByDishHourAndRestId(int hour, long restId);

上面这4个方法是一样的,对应的SQL如下:


select count(id) from aaa where dishHour=? and restId=?

下面这种定义,没有意义,知晓一下就好:


int countDistinctByDishHourAndRestId(int hour, long restId);

对应SQL如下,如果表中有主键,功能跟countBy是一致的,浪费性能:


select distinct count(distinct id) from aaa where dishHour=? and restId=?

2、exists相关,返回值只能是 boolean


boolean existsByDishHourAndRestId(int hour, long restId);
boolean existsaaaByDishHourAndRestId(int hour, long restId);
boolean existsaaasByDishHourAndRestId(int hour, long restId);
boolean existsAllByDishHourAndRestId(int hour, long restId);

上面这4个方法是一样的,对应的SQL如下:


select id from aaa where dishHour=? and restId=? limit 1

下面这种定义,没有意义,知晓一下就好:


boolean existsDistinctByDishHourAndRestId(int hour, long restId);

对应SQL如下,功能跟existsBy是一致的,多余:


select distinct id from aaa where dishHour=? and restId=? limit 1

3、find相关,返回值是数组List<aaa>


List<aaa> findByDishHourAndRestId(int hour, long restId);
List<aaa> findaaaByDishHourAndRestId(int hour, long restId);
List<aaa> findaaasByDishHourAndRestId(int hour, long restId);
List<aaa> findAllByDishHourAndRestId(int hour, long restId);
List<aaa> getByDishHourAndRestId(int hour, long restId);
List<aaa> getaaaByDishHourAndRestId(int hour, long restId);
List<aaa> getaaasByDishHourAndRestId(int hour, long restId);
List<aaa> getAllByDishHourAndRestId(int hour, long restId);
List<aaa> queryByDishHourAndRestId(int hour, long restId);
List<aaa> queryaaaByDishHourAndRestId(int hour, long restId);
List<aaa> queryaaasByDishHourAndRestId(int hour, long restId);
List<aaa> queryAllByDishHourAndRestId(int hour, long restId);
List<aaa> readByDishHourAndRestId(int hour, long restId);
List<aaa> readaaaByDishHourAndRestId(int hour, long restId);
List<aaa> readaaasByDishHourAndRestId(int hour, long restId);
List<aaa> readAllByDishHourAndRestId(int hour, long restId);
List<aaa> streamByDishHourAndRestId(int hour, long restId);
List<aaa> streamaaaByDishHourAndRestId(int hour, long restId);
List<aaa> streamaaasByDishHourAndRestId(int hour, long restId);
List<aaa> streamAllByDishHourAndRestId(int hour, long restId);

上面这20个方法是一样的,对应的SQL如下:


select id,dishHour,num,restId from aaa where dishHour=? and restId=?

下面这种定义,没有意义,知晓一下就好:


List<aaa> findDistinctByDishHourAndRestId(int hour, long restId);

对应SQL如下,如果表中有主键,功能跟findBy是一致的,多余:


select distinct id,dishHour,num,restId from aaa where dishHour=? and restId=?

4、findFirst相关,返回值是aaa


aaa findFirstByDishHourAndRestId(int hour, long restId);
aaa findTopByDishHourAndRestId(int a, long b);
aaa getFirstByDishHourAndRestId(int hour, long restId);
aaa getTopByDishHourAndRestId(int a, long b);
aaa queryFirstByDishHourAndRestId(int hour, long restId);
aaa queryTopByDishHourAndRestId(int a, long b);
aaa readFirstByDishHourAndRestId(int hour, long restId);
aaa readTopByDishHourAndRestId(int a, long b);
aaa streamFirstByDishHourAndRestId(int hour, long restId);
aaa streamTopByDishHourAndRestId(int a, long b);

上面这10个方法是一样的,对应的SQL如下:


select id,dishHour,num,restId from aaa where dishHour=? and restId=? limit 1

注:返回值也可以改成List<aaa>,但是SQL不变,返回的数组也只有一条数据

下面这种定义,没有意义,知晓一下就好:


List<aaa> findDistinctFirstByDishHourAndRestId(int hour, long restId);

对应SQL如下,如果表中有主键,功能跟countBy是一致的,多余:


select distinct id,dishHour,num,restId from aaa where dishHour=? and restId=? limit 1

5、delete相关,返回值是int,删除行数


@Transactional
int deleteaaaByDishHourAndRestId(int a, long b);
@Transactional
int deleteaaasByDishHourAndRestId(int a, long b);
@Transactional
int deleteAllByDishHourAndRestId(int a, long b);
@Transactional
int deleteByDishHourAndRestId(int a, long b);
@Transactional
int removeaaaByDishHourAndRestId(int a, long b);
@Transactional
int removeaaasByDishHourAndRestId(int a, long b);
@Transactional
int removeAllByDishHourAndRestId(int a, long b);
@Transactional
int removeByDishHourAndRestId(int a, long b);

上面这8个方法是一样的,对应有2条SQL,如下:


select id,dishHour,num,restId from aaa where dishHour=? and restId=?
delete from aaa where id=?

注:先SELECT查找主键,再进行删除,所以必须在方法前加注解Transactional,提供事务,否则会抛异常。

下面这种定义,没有意义,知晓一下就好:


int deleteDistinctByDishHourAndRestId(int hour, long restId);

对应SQL如下,如果表中有主键,功能跟deleteBy是一致的,多余:


select distinct id,dishHour,num,restId from aaa where dishHour=? and restId=?

注1:方法By后面的语法,可以参考下图,或官方文档

在这里插入图片描述

注2:JPA Query注解问题:

SQL里可以用 #{#entityName} 占位符,替代手写表名,如:


@Query(value = "select * from #{#entityName} where 1=2", nativeQuery = true)
aaa selectXXX();

INSERT、UPDATE、DELETE这3种DML操作,返回值只能是void、int、long,且必须增加2个注解,例如:


// 返回值不是void、int、long,报错:
// Modifying queries can only use void or int/Integer as return type!
// 不加 Transactional 报错: 
// javax.persistence.TransactionRequiredException: Executing an update/delete query
@Transactional
// 不加Modifing 报错:
// Can not issue data manipulation statements with executeQuery().
@Modifying
@Query(value = "update #{#entityName} set num=num+1 where id=6", nativeQuery = true)
int doupdate();

注3:JPA原生方法列表:


List<T> findAll();
List<T> findAll(Sort var1);
List<T> findAllById(Iterable<ID> var1);
<S extends T> List<S> saveAll(Iterable<S> var1);
void flush();
<S extends T> S saveAndFlush(S var1);
void deleteInBatch(Iterable<T> var1);
void deleteAllInBatch();
T getOne(ID var1);
<S extends T> List<S> findAll(Example<S> var1);
<S extends T> List<S> findAll(Example<S> var1, Sort var2);

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JPA-JpaRepository方法命名语法说明

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Ping命令使用方法详细说明

ping [-t] [-a] [-n count] [-l length] [-f] [-i ttl] [-v tos] [-r count] [-s count] [-j computer-list] │ [-k computer-lis
2023-05-23

cmd copy命令的说明及使用方法

本篇内容介绍了“cmd copy命令的说明及使用方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!copy,中文含义为“复制”,一个很容易见
2023-06-08

R语言将变量分组的3种方法实例(含cut函数说明)

在数据处理分析过程中,变量分组是经常遇到的,下面这篇文章主要给大家介绍了关于R语言将变量分组的3种方法,其中含cut函数说明的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
2022-11-13

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录