JPA-JpaRepository方法命名語(yǔ)法說(shuō)明
前言
梳理了一遍JPA的方法命名語(yǔ)法,記錄一下,以便后續(xù)備查。
注:本文不介紹JPL語(yǔ)法,版本為spring-data-jpa-2.3.0.RELEASE。
假設(shè)實(shí)體類名為 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; }
對(duì)應(yīng)的倉(cāng)儲(chǔ)層接口定義:
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的語(yǔ)法分為如下5種:
1、count相關(guān),返回值為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個(gè)方法是一樣的,對(duì)應(yīng)的SQL如下:
select count(id) from aaa where dishHour=? and restId=?
下面這種定義,沒(méi)有意義,知曉一下就好:
int countDistinctByDishHourAndRestId(int hour, long restId);
對(duì)應(yīng)SQL如下,如果表中有主鍵,功能跟countBy是一致的,浪費(fèi)性能:
select distinct count(distinct id) from aaa where dishHour=? and restId=?
2、exists相關(guān),返回值只能是 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個(gè)方法是一樣的,對(duì)應(yīng)的SQL如下:
select id from aaa where dishHour=? and restId=? limit 1
下面這種定義,沒(méi)有意義,知曉一下就好:
boolean existsDistinctByDishHourAndRestId(int hour, long restId);
對(duì)應(yīng)SQL如下,功能跟existsBy是一致的,多余:
select distinct id from aaa where dishHour=? and restId=? limit 1
3、find相關(guān),返回值是數(shù)組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個(gè)方法是一樣的,對(duì)應(yīng)的SQL如下:
select id,dishHour,num,restId from aaa where dishHour=? and restId=?
下面這種定義,沒(méi)有意義,知曉一下就好:
List<aaa> findDistinctByDishHourAndRestId(int hour, long restId);
對(duì)應(yīng)SQL如下,如果表中有主鍵,功能跟findBy是一致的,多余:
select distinct id,dishHour,num,restId from aaa where dishHour=? and restId=?
4、findFirst相關(guān),返回值是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個(gè)方法是一樣的,對(duì)應(yīng)的SQL如下:
select id,dishHour,num,restId from aaa where dishHour=? and restId=? limit 1
注:返回值也可以改成List<aaa>,但是SQL不變,返回的數(shù)組也只有一條數(shù)據(jù)
下面這種定義,沒(méi)有意義,知曉一下就好:
List<aaa> findDistinctFirstByDishHourAndRestId(int hour, long restId);
對(duì)應(yīng)SQL如下,如果表中有主鍵,功能跟countBy是一致的,多余:
select distinct id,dishHour,num,restId from aaa where dishHour=? and restId=? limit 1
5、delete相關(guān),返回值是int,刪除行數(shù)
@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個(gè)方法是一樣的,對(duì)應(yīng)有2條SQL,如下:
select id,dishHour,num,restId from aaa where dishHour=? and restId=? delete from aaa where id=?
注:先SELECT查找主鍵,再進(jìn)行刪除,所以必須在方法前加注解Transactional,提供事務(wù),否則會(huì)拋異常。
下面這種定義,沒(méi)有意義,知曉一下就好:
int deleteDistinctByDishHourAndRestId(int hour, long restId);
對(duì)應(yīng)SQL如下,如果表中有主鍵,功能跟deleteBy是一致的,多余:
select distinct id,dishHour,num,restId from aaa where dishHour=? and restId=?
注1:方法By后面的語(yǔ)法,可以參考下圖,或官方文檔:
注2:JPA Query注解問(wèn)題:
SQL里可以用 #{#entityName} 占位符,替代手寫(xiě)表名,如:
@Query(value = "select * from #{#entityName} where 1=2", nativeQuery = true) aaa selectXXX();
INSERT、UPDATE、DELETE這3種DML操作,返回值只能是void、int、long,且必須增加2個(gè)注解,例如:
// 返回值不是void、int、long,報(bào)錯(cuò): // Modifying queries can only use void or int/Integer as return type! // 不加 Transactional 報(bào)錯(cuò): // javax.persistence.TransactionRequiredException: Executing an update/delete query @Transactional // 不加Modifing 報(bào)錯(cuò): // 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);
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringAop自定義切面注解、自定義過(guò)濾器及ThreadLocal詳解
這篇文章主要介紹了SpringAop自定義切面注解、自定義過(guò)濾器及ThreadLocal詳解,Aspect(切面)通常是一個(gè)類,里面可以定義切入點(diǎn)和通知(切面 = 切點(diǎn)+通知),execution()是最常用的切點(diǎn)函數(shù),需要的朋友可以參考下2024-01-01Spring Cloud Gateway全局異常處理的方法詳解
這篇文章主要給大家介紹了關(guān)于Spring Cloud Gateway全局異常處理的相關(guān)資料,需要的朋友可以參考下2018-10-10用Rational Rose逆向工程(java)生成類圖(教程和錯(cuò)誤解決)
Rational Rose有個(gè)很方便的功能,將項(xiàng)目中的JAVA代碼自動(dòng)轉(zhuǎn)換成UML類圖2013-02-02Java設(shè)計(jì)模式之解釋器模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
解釋器模式是一個(gè)比較少用的模式,本人之前也沒(méi)有用過(guò)這個(gè)模式。下面我們就來(lái)一起看一下解釋器模式2017-08-08Java實(shí)現(xiàn)畫(huà)圖的詳細(xì)步驟(完整代碼)
今天給大家?guī)?lái)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著Java實(shí)現(xiàn)畫(huà)圖的詳細(xì)步驟展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06springboot2啟動(dòng)時(shí)執(zhí)行,初始化(或定時(shí)任務(wù))servletContext問(wèn)題
這篇文章主要介紹了springboot2啟動(dòng)時(shí)執(zhí)行,初始化(或定時(shí)任務(wù))servletContext問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01使用GenericObjectPool避免泄漏設(shè)置方法
這篇文章主要為大家介紹了使用GenericObjectPool避免泄漏的設(shè)置方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09