返回顶部
首页 > 资讯 > 后端开发 > Python >JPA-JpaRepository方法命名语法说明
  • 734
分享到

JPA-JpaRepository方法命名语法说明

2024-04-02 19:04:59 734人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录前言JPA的语法分为如下5种:1、count相关,返回值为int或long2、exists相关,返回值只能是boolean3、find相关,返回值是数组List<aaa&g

前言

梳理了一遍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);

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

--结束END--

本文标题: JPA-JpaRepository方法命名语法说明

本文链接: https://lsjlt.com/news/158141.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JPA-JpaRepository方法命名语法说明
    目录前言JPA的语法分为如下5种:1、count相关,返回值为int或long2、exists相关,返回值只能是boolean3、find相关,返回值是数组List<aaa&g...
    99+
    2024-04-02
  • JPA findById方法和getOne方法的区别说明
    目录findById方法和getOne方法区别getOne()方法是JpaRepository接口中定义的再看findById()方法spring-data-jpa中findById...
    99+
    2024-04-02
  • Spring Data JPA 关键字Exists的用法说明
    Spring Data JPA 关键字Exists 查询数据库中的此数据是否已存在: 例子: 查询sys_user表中的一个user是否存在,类SysUser对应的是数据库中的sys...
    99+
    2024-04-02
  • Ping命令使用方法详细说明
    ping [-t] [-a] [-n count] [-l length] [-f] [-i ttl] [-v tos] [-r count] [-s count] [-j computer-list] │ [-k co...
    99+
    2023-05-23
    使用 Ping 方法
  • cmd copy命令的说明及使用方法
    本篇内容介绍了“cmd copy命令的说明及使用方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!copy,中文含义为“复制”,一个很容易见...
    99+
    2023-06-08
  • docker create命令的用法说明
    docker create命令能够基于镜像创建容器。 该命令执行的效果类似于docker run -d,即创建一个将在系统后台运行的容器。 但是与docker run -d不同的是,...
    99+
    2024-04-02
  • Python,内置方法说明
    abs()    取绝对值dict()    数据转成字典min()    从列表取最小值 >>> a = [1,4,5,-1,3] >>> min(a) -1 >>> max(a) 5...
    99+
    2023-01-31
    方法 Python
  • go语言中fallthrough的用法说明
    fallthrough:Go里面switch默认相当于每个case最后带有break,匹配成功后不会自动向下执行其他case,而是跳出整个switch, 但是可以使用fallt...
    99+
    2022-06-07
    fallthrough GO go语言
  • JS中newDate()各方法的用法说明
    目录JS中 new Date() 各方法的用法1.new Date() 参数篇2.方法篇3.国标时间、时间戳、年月日 时分秒的转换JS中 new Date() 各方法的用法 1.ne...
    99+
    2022-12-19
    JS中 new Date() 各方法的用法 JS中 new Date() JS中 new Date() 用法
  • Python中turtle.write方法使用说明
    目录turtle.write方法使用说明例子绘制一朵小花的例子如何使用turtle.write方法将文字显示为一个圆圈?总结turtle.write方法使用说明 关于turtle可参...
    99+
    2024-04-02
  • Swift Error的处理方法说明
    目录错误类型自定义错误处理Errortry与try!rethrowsdefer错误类型 1、开发过程常见的错误 语法错误(编译报错)逻辑错误运行时错误(可能会导致闪退,一般也叫做异常...
    99+
    2024-04-02
  • mysqlinsert存在即不插入语法说明
    目录insert 存在即不插入语法介绍三种方式第一种:replace into第二种:DUAL临时表第三种:根据主键判断效果区别已有数据存在则不插入,否则则修改用法inse...
    99+
    2024-04-02
  • cmd del命令的说明和具体用法
    这篇文章主要介绍“cmd del命令的说明和具体用法”,在日常操作中,相信很多人在cmd del命令的说明和具体用法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”cmd del命令的说明和具体用法”的疑惑有所...
    99+
    2023-06-08
  • node.js中的dns.getServers方法使用说明
    方法说明: 返回当前正在使用的 ip地址,以字符串形式返回 语法: dns.getServers() 接收参数: 无 源码: exports.getServers = function() { ...
    99+
    2022-06-04
    使用说明 方法 js
  • node.js中的events.EventEmitter.listenerCount方法使用说明
    方法说明: 返回注册了指定事件的监听器数量。 语法: EventEmitter.listenerCount(emitter, event) 接收参数: emitter 事件发射器...
    99+
    2022-06-04
    使用说明 方法 js
  • node.js中的path.resolve方法使用说明
    方法说明: 将参数 to 位置的字符解析到一个绝对路径里。 语法: path.resolve([from ...], to) 由于该方法属于path模块,使用前需要引入path模块(var path= ...
    99+
    2022-06-04
    使用说明 方法 js
  • node.js中的path.sep方法使用说明
    方法说明: 将特定文字分隔符 ‘\' 或 ‘/' 的字符串转换成数组对象。 语法: path.sep 由于该方法属于path模块,使用前需要引入path模块(var path= require(“pat...
    99+
    2022-06-04
    使用说明 方法 js
  • node.js中的path.normalize方法使用说明
    方法说明: 输出规范格式的path字符串。 语法: path.normalize(p) 由于该方法属于path模块,使用前需要引入path模块(var path= require(“path”) ) 例...
    99+
    2022-06-04
    使用说明 方法 js
  • node.js中的path.join方法使用说明
    方法说明: 将多个参数组合成一个 path (详细请看例子) 语法: path.join([path1], [path2], [...]) 由于该方法属于path模块,使用前需要引入path模块(var...
    99+
    2022-06-04
    使用说明 方法 js
  • node.js中的path.isAbsolute方法使用说明
    方法说明: 检测path是否为绝对路径。一个绝对路径会解析到相同的位置,无论是不是在工作目录。 语法: path.isAbsolute(path) 由于该方法属于path模块,使用前需要引入path模块...
    99+
    2022-06-04
    使用说明 方法 js
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作