Spring Data JPA中findOne()和getOne()用法
引言
最近在使用SpringDataJPA做CRUD功能,在做到需要查詢單個(gè)的功能的時(shí)候,
我們發(fā)現(xiàn)SpringDataJPA為我們提供了兩種辦法findOne() 和 getOne(),
那我們?cè)撊绾芜x擇呢,他們之間的區(qū)別又是什么呢,下面我們來(lái)總結(jié)一下。
findOne() 和 getOne()的區(qū)別
首先我們看一下Spring官方對(duì)他們的解釋
/**
* Retrieves an entity by its id.
* @param id must not be {@literal null}.
* @return the entity with the given id or {@literal null} if none found
* @throws IllegalArgumentException if {@code id} is {@literal null}
* /
T findOne(ID id);
/**
* Returns a reference to the entity with the given identifier.
*
* @param id must not be {@literal null}.
* @return a reference to the entity with the given identifier.
* @see EntityManager#getReference(Class, Object)
*/
T getOne(ID id);findOne:當(dāng)我查詢一個(gè)不存在的id數(shù)據(jù)時(shí),返回的值是null.

getOne: return 對(duì)具有給定標(biāo)識(shí)符的實(shí)體的引用。
當(dāng)我查詢一個(gè)不存在的id數(shù)據(jù)時(shí),直接拋出異常,因?yàn)樗祷氐氖且粋€(gè)引用,簡(jiǎn)單點(diǎn)說(shuō)就是一個(gè)代理對(duì)象。

我們知道SpringDataJPA底層默認(rèn)使用Hibernate,hibernate對(duì)于load方法認(rèn)為該數(shù)據(jù)在數(shù)據(jù)庫(kù)中一定存在,可以放心的使用代理來(lái)延遲加載,如果在使用過(guò)程中發(fā)現(xiàn)了問(wèn)題,只能拋異常;
而對(duì)于get方法,hibernate一定要獲取到真實(shí)的數(shù)據(jù),否則返回null。
所以我們可以吧findOne() 當(dāng)成hibernate中g(shù)et方法,getOne()當(dāng)成hibernate中l(wèi)oad方法來(lái)記憶。。。。。
補(bǔ)充
以前我們使用Spring Data Jpa 的查詢單個(gè)的時(shí)候,可以使用findOne()方法根據(jù)id查詢。
但是在2.0.5以后,不能用來(lái)當(dāng)作根據(jù)id查詢了。2.0.5以后變成了findById(id).get()來(lái)查詢了。
2.0.5版本以前的CrudRepository類是這樣的:
@NoRepositoryBean
public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {
<S extends T> S save(S var1);
<S extends T> Iterable<S> save(Iterable<S> var1);
T findOne(ID var1);
boolean exists(ID var1);
Iterable<T> findAll();
Iterable<T> findAll(Iterable<ID> var1);
long count();
void delete(ID var1);
void delete(T var1);
void delete(Iterable<? extends T> var1);
void deleteAll();
}
2.0.5版本以后的CrudRepository類是這樣的:
@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {
<S extends T> S save(S var1);
<S extends T> Iterable<S> saveAll(Iterable<S> var1);
Optional<T> findById(ID var1);
boolean existsById(ID var1);
Iterable<T> findAll();
Iterable<T> findAllById(Iterable<ID> var1);
long count();
void deleteById(ID var1);
void delete(T var1);
void deleteAll(Iterable<? extends T> var1);
void deleteAll();
}
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決httpServletRequest.getParameter獲取不到參數(shù)的問(wèn)題
這篇文章主要介紹了解決httpServletRequest.getParameter獲取不到參數(shù)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
Java實(shí)現(xiàn)的圖像查看器完整實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)的圖像查看器,以完整實(shí)例形式較為詳細(xì)的分析了java處理圖片的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
Spring Boot 工程的創(chuàng)建和運(yùn)行(圖文)
這篇文章主要介紹了Spring Boot 工程的創(chuàng)建和運(yùn)行(圖文),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02
詳解Spring如何更簡(jiǎn)單的讀取和存儲(chǔ)對(duì)象
這篇文章主要為大家詳細(xì)介紹了Spring中如何更簡(jiǎn)單的實(shí)現(xiàn)讀取和存儲(chǔ)對(duì)象,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-07-07
Java基礎(chǔ)知識(shí)精選 你答對(duì)了幾道?
精選Java基礎(chǔ)知識(shí)講解,看看你能答對(duì)多少?2017-09-09
SpringBoot項(xiàng)目打包為JAR文件的實(shí)現(xiàn)
本文主要介紹了SpringBoot項(xiàng)目打包為JAR文件的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-09-09
Spring Data JPA 如何使用QueryDsl查詢并分頁(yè)
這篇文章主要介紹了Spring Data JPA 如何使用QueryDsl查詢并分頁(yè),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11

