1. 程式人生 > >SpringDateJpa — findOne()方法報錯問題以及getOne()

SpringDateJpa — findOne()方法報錯問題以及getOne()

遇到的問題:


首先我說一下我遇到問題的由來

我先是用的SpringDataJPA的1.11版本,可以使用findOne()方法根據id查詢,

然後我使用了2.0.5版本,發現findOne()方法報錯了,不能用來當作根據id查詢了,

  • getOne 當查詢一個不存在的id資料時,會直接丟擲異常,因為其返回的是一個引用,簡單就是說一個代理物件。
  • 無論如何都想要有一個返回,則使用findOne,而不用getOne。

2.0.5的已經變成了findById(id).get()來查詢了


這是兩個不同的版本,原始碼已經發生變化。

後來去找原始碼中的findOne方法發現,findOne方法已經變了。

想了解跟多的朋友可以去https://projects.spring.io/spring-boot/瞭解

1.xx版本的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.x.x版本的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(); }

發現了嗎?     findOne方法不在CrudRepository中了

而現在的findOne去了哪裡呢?

public interface QueryByExampleExecutor<T> {
    <S extends T> Optional<S> findOne(Example<S> var1);
<S extends T> Iterable<S> findAll(Example<S> var1);
<S extends T> Iterable<S> findAll(Example<S> var1, Sort var2);
<S extends T> Page<S> findAll(Example<S> var1, Pageable var2);
<S extends T> long count(Example<S> var1);
<S extends T> boolean exists(Example<S> var1);
}