首页 > 数据库 >JPA-JpaRepository方法命名语法说明 和对应执行的SQL 表名字占位符 #{#entityName}

JPA-JpaRepository方法命名语法说明 和对应执行的SQL 表名字占位符 #{#entityName}

时间:2023-01-11 09:45:40浏览次数:82  
标签:aaa hour restId JPA entityName List long int JpaRepository

JPA-JpaRepository方法命名语法说明 和对应执行的SQL 表名字占位符 #{#entityName}
http://news.558idc.com/148964.html

目录 前言 JPA的语法分为如下5种: 1、count相关,返回值为int 或 long 2、exists相关,返回值只能是 boolean 3、find相关,返回值是数组Listaaa 4、findFirst相关,返回值是aaa 5、delete相关,返回值
目录
  • 前言
  • JPA的语法分为如下5种:
    • 1、count相关,返回值为int 或 long
    • 2、exists相关,返回值只能是 boolean
    • 3、find相关,返回值是数组List<aaa>
    • 4、findFirst相关,返回值是aaa
    • 5、delete相关,返回值是int,删除行数

前言

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持自由互联。

标签:aaa,hour,restId,JPA,entityName,List,long,int,JpaRepository
From: https://www.cnblogs.com/sunny3158/p/17042874.html

相关文章

  • SpringDataJPA 程序未配置乐观锁的情况下,报了乐观锁异常
    目录问题原因复现附:报错日志问题报错日志:详见文章结尾附:报错日志程序ORM框架使用的SpringDataJPA,程序中未配置@Version或者@OptimisticLocking注解,但是报了一个乐观......
  • sprinboot jpa实体支持mysql json字段配置
    mysql字段springboot配置依赖compile('com.vladmihalcea:hibernate-types-52:2.4.1')实体@Getter@Setter@Entity(name="opt_log")@TypeDef(name="json",......
  • 使用基于 Vaadin 的用户界面在基于 Spring Data JPA 的后端
    本指南将引导您完成构建使用基于Vaadin的用户界面在基于SpringDataJPA的后端。您将构建什么您将为一个简单的JPA存储库构建一个VaadinUI。您将获得一个具有完整C......
  • 使用 Spring Data JPA 在关系数据库中存储和检索数据
    本指南将引导您完成构建应用程序的过程,该应用程序使用SpringDataJPA在关系数据库中存储和检索数据。您将构建什么您将构建一个应用程序,用于在基于内存的数据库中存储PO......
  • JPA
    定义JPA顾名思义就是JavaPersistenceAPI的意思,是JDK5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。优点2.1标准化JPA是JCP组织发......
  • Kotlin + SpringBoot + JPA 服务端开发
    Kotlin+SpringBoot+JPA服务端开发本篇主要介绍一下kotlin+springboot的服务端开发环境搭建1.概述Kotlin是一个基于JVM的编程语言,是IDEA开发工具jetbrai......
  • 理解JPA注解@GeneratedValue的使用方法
    一、JPA通用策略生成器通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id,其生成规则由@GeneratedValue设定的.这里的@id和@GeneratedValue都是......
  • JPA @Table 注解
    ​​@Table​​ 是类级别的注解,用于声明实体映射到数据库中的具体的表。参数类型描述nameString表的名称,默认为实体名称(参考 ​​@Entity​​​ 注解的 ​​name​​​......
  • SpringBoot入门系列: JPA mysql(五)
    一,准备工作,建立spring-boot-sample-mysql工程1、http://start.spring.io/    A、Artifact中输入spring-boot-sample-mysql    B、勾选Web下的web    C、勾选......
  • springboot jpa创建表自动添加注释
    @Retention(RetentionPolicy.RUNTIME)@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})public@interfaceComment{Stringvalue()default......