原文地址 https://blog.csdn.net/xuemengrui12/article/details/80525227?utm_source=blogxgwz0
https://www.imooc.com/article/16983
先看下兩者的接口代碼:
-
-
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();
-
}
-
-
public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
-
List<T> findAll();
-
List<T> findAll(Sort var1);
-
List<T> findAll(Iterable<ID> var1);
-
<S extends T> List<S> save(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);
-
}
看一下他們的繼承關系
注意下兩者的save方法的不同,JpaRepository 中的save方法實現源碼:
-
-
public <S extends T> List<S> save(Iterable<S> entities) {
-
List<S> result = new ArrayList<S>();
-
if (entities == null) {
-
return result;
-
}
-
for (S entity : entities) {
-
result.add(save(entity));
-
}
-
return result;
-
}
CrudRepository 中的save方法源代碼
-
-
public <S extends T> S save(S entity) {
-
if (entityInformation.isNew(entity)) {
-
em.persist(entity); //是新的就插入
-
return entity;
-
} else {
-
return em.merge(entity); //不是新的merge
-
}
-
}
由源碼可知CrudRepository 中的save方法是相當於merge+save ,它會先判斷記錄是否存在,如果存在則更新,不存在則插入記錄。唉,還是需要多看源碼啊
參考:
一、JpaRepository支持接口規范方法名查詢。意思是如果在接口中定義的查詢方法符合它的命名規則,就可以不用寫實現。使用命名化參數,使用@Param即可,比如:@Query(value="select o from UserModel o where o.name like %:nn") public List<UserModel> findByUuidOrAge(@Param("nn") String name);
二、spring data jpa 通過創建方法名來做查詢,只能做簡單的查詢,那如果我們要做復雜一些的查詢呢,多條件分頁怎么辦,這里,spring data jpa為我們提供了JpaSpecificationExecutor接口,只要簡單實現toPredicate方法就可以實現復雜的查詢。JpaSpecificationExecutor提供了以下接口
public interface JpaSpecificationExecutor<T> { T findOne(Specification<T> spec); List<T> findAll(Specification<T> spec); Page<T> findAll(Specification<T> spec, Pageable pageable); List<T> findAll(Specification<T> spec, Sort sort); long count(Specification<T> spec); }