前言
梳理了一遍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{ int countByDishHourAndRestId(int hour, long restId); boolean existsByDishHourAndRestId(int hour, long restId); List 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
ListfindByDishHourAndRestId(int hour, long restId); List findaaaByDishHourAndRestId(int hour, long restId); List findaaasByDishHourAndRestId(int hour, long restId); List findAllByDishHourAndRestId(int hour, long restId); List getByDishHourAndRestId(int hour, long restId); List getaaaByDishHourAndRestId(int hour, long restId); List getaaasByDishHourAndRestId(int hour, long restId); List getAllByDishHourAndRestId(int hour, long restId); List queryByDishHourAndRestId(int hour, long restId); List queryaaaByDishHourAndRestId(int hour, long restId); List queryaaasByDishHourAndRestId(int hour, long restId); List queryAllByDishHourAndRestId(int hour, long restId); List readByDishHourAndRestId(int hour, long restId); List readaaaByDishHourAndRestId(int hour, long restId); List readaaasByDishHourAndRestId(int hour, long restId); List readAllByDishHourAndRestId(int hour, long restId); List streamByDishHourAndRestId(int hour, long restId); List streamaaaByDishHourAndRestId(int hour, long restId); List streamaaasByDishHourAndRestId(int hour, long restId); List streamAllByDishHourAndRestId(int hour, long restId);
上面这20个方法是一样的,对应的SQL如下:
select id,dishHour,num,restId from aaa where dishHour=? and restId=?
下面这种定义,没有意义,知晓一下就好:
ListfindDistinctByDishHourAndRestId(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
下面这种定义,没有意义,知晓一下就好:
ListfindDistinctFirstByDishHourAndRestId(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原生方法列表:
ListfindAll(); List findAll(Sort var1); List findAllById(Iterable var1); ListsaveAll(Iterablevar1); void flush();S saveAndFlush(S var1); void deleteInBatch(Iterablevar1); void deleteAllInBatch(); T getOne(ID var1); ListfindAll(Examplevar1);ListfindAll(Examplevar1, Sort var2);
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。