Spring Boot中CrudRepository与JpaRepository Dao中JpaRepository和JpaSpecificationExecutor查询

原文地址  https://blog.csdn.net/xuemengrui12/article/details/80525227?utm_source=blogxgwz0

 https://www.imooc.com/article/16983

 

先看下两者的接口代码:
 
  1.  
    @NoRepositoryBean
  2.  
    public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {
  3.  
    <S extends T> S save(S var1);
  4.  
    <S extends T> Iterable<S> save(Iterable<S> var1);
  5.  
    T findOne(ID var1);
  6.  
    boolean exists(ID var1);
  7.  
    Iterable<T> findAll();
  8.  
    Iterable<T> findAll(Iterable<ID> var1);
  9.  
    long count();
  10.  
    void delete(ID var1);
  11.  
    void delete(T var1);
  12.  
    void delete(Iterable<? extends T> var1);
  13.  
    void deleteAll();
  14.  
    }
 
  1.  
    @NoRepositoryBean
  2.  
    public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
  3.  
    List<T> findAll();
  4.  
    List<T> findAll(Sort var1);
  5.  
    List<T> findAll(Iterable<ID> var1);
  6.  
    <S extends T> List<S> save(Iterable<S> var1);
  7.  
    void flush();
  8.  
    <S extends T> S saveAndFlush(S var1);
  9.  
    void deleteInBatch(Iterable<T> var1);
  10.  
    void deleteAllInBatch();
  11.  
    T getOne(ID var1);
  12.  
    <S extends T> List<S> findAll(Example<S> var1);
  13.  
    <S extends T> List<S> findAll(Example<S> var1, Sort var2);
  14.  
    }
 

看一下他们的继承关系


 

注意下两者的save方法的不同,JpaRepository 中的save方法实现源码:
 
  1.  
    @Transactional
  2.  
    public <S extends T> List<S> save(Iterable<S> entities) {
  3.  
    List<S> result = new ArrayList<S>();
  4.  
    if (entities == null) {
  5.  
    return result;
  6.  
    }
  7.  
    for (S entity : entities) {
  8.  
    result.add(save(entity));
  9.  
    }
  10.  
    return result;
  11.  
    }
CrudRepository 中的save方法源代码
  1.  
    @Transactional
  2.  
    public <S extends T> S save(S entity) {
  3.  
    if (entityInformation.isNew(entity)) {
  4.  
    em.persist(entity); //是新的就插入
  5.  
    return entity;
  6.  
    } else {
  7.  
    return em.merge(entity); //不是新的merge
  8.  
    }
  9.  
    }
 
由源码可知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); }
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值