Spring Data JPA中findOne()和getOne()用法
引言
最近在使用SpringDataJPA做CRUD功能,在做到需要查詢單個(gè)的功能的時(shí)候,
我們發(fā)現(xiàn)SpringDataJPA為我們提供了兩種辦法findOne() 和 getOne(),
那我們?cè)撊绾芜x擇呢,他們之間的區(qū)別又是什么呢,下面我們來總結(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)說就是一個(gè)代理對(duì)象。
我們知道SpringDataJPA底層默認(rèn)使用Hibernate,hibernate對(duì)于load方法認(rèn)為該數(shù)據(jù)在數(shù)據(jù)庫中一定存在,可以放心的使用代理來延遲加載,如果在使用過程中發(fā)現(xiàn)了問題,只能拋異常;
而對(duì)于get方法,hibernate一定要獲取到真實(shí)的數(shù)據(jù),否則返回null。
所以我們可以吧findOne() 當(dāng)成hibernate中g(shù)et方法,getOne()當(dāng)成hibernate中l(wèi)oad方法來記憶。。。。。
補(bǔ)充
以前我們使用Spring Data Jpa 的查詢單個(gè)的時(shí)候,可以使用findOne()方法根據(jù)id查詢。
但是在2.0.5以后,不能用來當(dāng)作根據(jù)id查詢了。2.0.5以后變成了findById(id).get()來查詢了。
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ù)的問題
這篇文章主要介紹了解決httpServletRequest.getParameter獲取不到參數(shù)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07Java實(shí)現(xiàn)的圖像查看器完整實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)的圖像查看器,以完整實(shí)例形式較為詳細(xì)的分析了java處理圖片的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10Spring Boot 工程的創(chuàng)建和運(yùn)行(圖文)
這篇文章主要介紹了Spring Boot 工程的創(chuàng)建和運(yùn)行(圖文),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-02-02詳解Spring如何更簡(jiǎn)單的讀取和存儲(chǔ)對(duì)象
這篇文章主要為大家詳細(xì)介紹了Spring中如何更簡(jiǎn)單的實(shí)現(xiàn)讀取和存儲(chǔ)對(duì)象,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-07-07Java基礎(chǔ)知識(shí)精選 你答對(duì)了幾道?
精選Java基礎(chǔ)知識(shí)講解,看看你能答對(duì)多少?2017-09-09SpringBoot項(xiàng)目打包為JAR文件的實(shí)現(xiàn)
本文主要介紹了SpringBoot項(xiàng)目打包為JAR文件的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-09-09Spring Data JPA 如何使用QueryDsl查詢并分頁
這篇文章主要介紹了Spring Data JPA 如何使用QueryDsl查詢并分頁,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11