• SpringdataJpa的官方API学习


    (将对Springdata JPA的API  第三章之后进行解释)

    一 .  Core concepts(核心概念)

    1.springdata中的中心接口是——Repository。这个接口没有什么重要的功能(原句称没什么惊喜的一个接口)。主要的作用就是标记和管理。其他的接口都是此接口的子类。

    Example 1:

     1 public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {
     2     <S extends T> S save(S var1);//保存给定的实体
     3 
     4     <S extends T> Iterable<S> save(Iterable<S> var1);//保存指定的实体集合
     5 
     6     T findOne(ID var1);查询指定id的实体
     7 
     8     boolean exists(ID var1);//判断一个实体是否与给定的ID存在
     9 
    10     Iterable<T> findAll();//返回所有实体
    11 
    12     Iterable<T> findAll(Iterable<ID> var1);//查询指定的实体集合
    13 
    14     long count();//该实体的总数
    15 
    16     void delete(ID var1);//根据id删除指定实体
    17 
    18     void delete(T var1);//删除指定实体
    19 
    20     void delete(Iterable<? extends T> var1);//删除指定的实体集合
    21 
    22     void deleteAll();//删除全部
    23 }

    除此还提供了一些技术相关的接口,比如 JpaRepository,MongoRepository这两个接口继承了CrudRepository

    2.CrudRepository

    1)CrudRepository有个子类PagingAndSortingRepository,增加了一些方法来实现分页。

    Example 2:

    1 public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> {
    2     Iterable<T> findAll(Sort var1);
    3 
    4     Page<T> findAll(Pageable var1);
    5 }

    Example 3:Sort中创建的是自定义的排序方式,PageRequest中创建的是自定义分页的方式(注意:分页索引是从0开始,所以想要查询第一页二十条数据时,应插入(0,20))。

    dao层:

    Controller(直接调用,没通过Service):

     

    2)除了普通查询,计数和删除查询都可以使用

    Example 4:计数查询

    dao

    controller:

    Example 5:派生删除查询

    dao:

    controller:

     3.查询数据

    Spring Data,将查询数据的方法分成了四个步骤。用处不大,在此不详述。

    4.定义dao层的继承接口

    通常,dao层接口将会继承RepositoryCrudRepository 或者PagingAndSortingRepository

    或者不想继承Springdata的接口,你也可以定义个自己的接口@RepositoryDefinition,继承CrudRepository 。可以定义一套完整的自己的方法。

    Example 6:

     1 @NoRepositoryBean
     2 interface MyBaseRepository<T, ID extends Serializable> extends Repository<T, ID> {
     3 
     4   Optional<T> findById(ID id);
     5 
     6   <S extends T> S save(S entity);
     7 }
     8 
     9 interface UserRepository extends MyBaseRepository<User, Long> {
    10   User findByEmailAddress(EmailAddress emailAddress);
    11 }

     5.空库

    spring提供了一些注解,用来对付这种空值请情况。

    @NonNullApi(默认,不接受零)
    @NonNull(可用来约束参数或返回值必须不能为零)
    @Nullable(可用来约束参数或返回值可以为零)

    Example 7:

    interface UserRepository : Repository<User, String> {
    
      fun findByUsername(username: String): User //该方法当传入一个空的参数时,将会抛出一个 EmptyResultDataAccessException  
    
      fun findByFirstname(firstname: String?): User? //该方法接受作为参数 firstname 并返回 零 在查询执行不会产生结果。
    }

    6.查询方法

    Spring中的基础架构中,有一种查询构建机制的约束。这种约束会忽略像find…Byread…Byquery…Bycount…By

    get…By这种前缀,而开始分析其余部分。当然还可以引入进一步的表达式,可以定义实体中的一些条件,用and或者or对他们进行连接。

    Example 8:

    interface PersonRepository extends Repository<User, Long> {
    
      List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);
    
      // Enables the distinct flag for the query
      List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);
      List<Person> findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname);
    
      // Enabling ignoring case for an individual property
      List<Person> findByLastnameIgnoreCase(String lastname);
      // Enabling ignoring case for all suitable properties
      List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname);
    
      // Enabling static ORDER BY for a query
      List<Person> findByLastnameOrderByFirstnameAsc(String lastname);
      List<Person> findByLastnameOrderByFirstnameDesc(String lastname);
    }


    IgnoreCase属性表示忽略大小写

    OrderBy表示引用属性进行查找时附加子句并提供排序方向(AscDesc

    7.关于特殊参数的处理(比如PageableSort in查询方法)

    Example 9:

    Page<User> findByLastname(String lastname, Pageable pageable);
    
    Slice<User> findByLastname(String lastname, Pageable pageable);
    
    List<User> findByLastname(String lastname, Sort sort);
    
    List<User> findByLastname(String lastname, Pageable pageable);

     8.关于限制查询的结果

    查询方法的结果可以通过关键字来限制,first或者top都可以互换使用。且后面可以直接加数字指定需要的前几位结果。

    Example 10:

    User findFirstByOrderByLastnameAsc();
    
    User findTopByOrderByAgeDesc();
    
    Page<User> queryFirst10ByLastname(String lastname, Pageable pageable);
    
    Slice<User> findTop3ByLastname(String lastname, Pageable pageable);
    
    List<User> findFirst10ByLastname(String lastname, Sort sort);
    
    List<User> findTop10ByLastname(String lastname, Pageable pageable)

     9.方法中支持的关键字

    lile在使用时,需要在字符串中加上“%%”

    Distinct去重

    10.使用注解 @Query

    Example 11:

    public interface UserRepository extends JpaRepository<User, Long> {
    
      @Query("select u from User u where u.emailAddress = ?1")
      User findByEmailAddress(String emailAddress);
    }

     Example 12:使用命名参数

    public interface UserRepository extends JpaRepository<User, Long> {
    
      @Query("select u from User u where u.firstname = :firstname or u.lastname = :lastname")
      User findByLastnameOrFirstname(@Param("lastname") String lastname,
                                     @Param("firstname") String firstname);
    }

      Example 13:声明操作查询

     
    @Modifying
    @Query("update User u set u.firstname = ?1 where u.lastname = ?2")
    int setFixedFirstnameFor(String firstname, String lastname);

     

     
     
     
  • 相关阅读:
    kthread_run
    05 七段数码管的实现
    Docker 面临的安全隐患,我们该如何应对
    7 天玩转 ASP.NET MVC — 第 6 天
    哪些问题困扰着我们?DevOps 使用建议
    如何使用 OneAPM 监控微软 Azure Cloud Service ?
    在 Java 中如何更高效地存储和管理 SQL 语句?
    规模化敏捷开发的10个最佳实践(上)
    如何在 Swift 语言下使用 iOS Charts API 制作漂亮图表?
    PHP 性能分析与实验——性能的宏观分析
  • 原文地址:https://www.cnblogs.com/miaoww/p/8252692.html
Copyright © 2020-2023  润新知