zoukankan      html  css  js  c++  java
  • 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);
    }
     

  • 相关阅读:
    Linux提供哪些功能
    C++——重载原理分析
    C++——多维数组动态开辟与释放
    C++——异常处理
    C++——流类库和输入/输出
    C++——virtual function
    C++——虚函数表解析
    C++——多态实现原理分析
    Python基础——__name__变量
    DNS服务——智能域名解析、镜像Web站点、直接域名泛域名
  • 原文地址:https://www.cnblogs.com/suizhikuo/p/9812222.html
Copyright © 2011-2022 走看看