Spring Data JPA中的getOne,findOne以及findById

咱們今天聊一下Spring Data JPA裏的三個方法,分別是getOnefindOne以及findById
咋一看三個方法都能返回一個結果集,用哪一個好像都沒問題。我當初也是這麼想的,後來在寫做業的過程當中出錯了,真相只有一個。
個人例子是查詢一個一對一映射關係的實體,極爲簡單,我就不上代碼了;用findById則能夠實現咱們的需求,而使用getOne查詢後對結果集進行打印,出現下面的異常。spring

org.hibernate.LazyInitializationException: could not initialize proxy - no Session

這個異常好像跟使用哪一個方法沒太大的關係,由於他是在獲得查詢的結果集後,打印這個結果集的時候出現的,且映射關係默認使用FetchType.EAGER,實體的toString方法僅對實體本身的屬性作打印,不處理映射關係,莫非是由於獲得的一個代理對象,不能映射成實體?還但願路過的高人指點一二。api

最後使用findOne,也能準確的查到結果,有趣的是打印了三條查詢語句。spa

翻開官方的API,找找這幾個磨人的方法都在哪:hibernate

  • getOne來自JpaReposiroty接口,對於傳入的標識則返回一個實體的引用;且取決於該方法的實現,可能會出現EntityNotFoundException,並會拒絕一些無效的標識;

clipboard.png

  • findById來自CrudRepository接口,經過它的id返回一個實體;

clipboard.png

  • findOne來自QueryByExampleExecutor接口,返回一個經過Example匹配的實體或者null

clipboard.png

那他們的區別也就是:代理

  • getOne返回一個實體的引用,無結果會拋出異常;
  • findById返回一個Optional對象;
  • findOne返回一個Optional對象,能夠實現動態查詢;

Optional表明一個可能存在也可能不存在的值。code

注:文中使用的版本爲Spring Data JPA 2.1.8.RELEASE對象

相關文章
相關標籤/搜索