SpringdataJpa的官方API学习

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

一 .  Core concepts(核心概念)

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

 

Example 1:

 

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

 

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

2.CrudRepository

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

 

Example 2:

 

1 public interface PagingAndSortingRepositoryextends Serializable> extends CrudRepository {
2     Iterable findAll(Sort var1);
3 
4     Page findAll(Pageable var1);
5 }

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

dao层:

SpringdataJpa的官方API学习_第1张图片

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

 SpringdataJpa的官方API学习_第2张图片

 

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

Example 4:计数查询

dao

controller:

SpringdataJpa的官方API学习_第3张图片

Example 5:派生删除查询

dao:

controller:

SpringdataJpa的官方API学习_第4张图片

 

 3.查询数据

 

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

 

4.定义dao层的继承接口

 

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

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

 

Example 6:

 

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

 5.空库

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

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

Example 7:

interface UserRepository : Repository {

  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 {

  List findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);

  // Enables the distinct flag for the query
  List findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);
  List findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname);

  // Enabling ignoring case for an individual property
  List findByLastnameIgnoreCase(String lastname);
  // Enabling ignoring case for all suitable properties
  List findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname);

  // Enabling static ORDER BY for a query
  List findByLastnameOrderByFirstnameAsc(String lastname);
  List findByLastnameOrderByFirstnameDesc(String lastname);
}


复制代码

IgnoreCase属性表示忽略大小写

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

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

Example 9:

复制代码
Page findByLastname(String lastname, Pageable pageable);

Slice findByLastname(String lastname, Pageable pageable);

List findByLastname(String lastname, Sort sort);

List findByLastname(String lastname, Pageable pageable);
复制代码

 8.关于限制查询的结果

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

Example 10:

复制代码
User findFirstByOrderByLastnameAsc();

User findTopByOrderByAgeDesc();

Page queryFirst10ByLastname(String lastname, Pageable pageable);

Slice findTop3ByLastname(String lastname, Pageable pageable);

List findFirst10ByLastname(String lastname, Sort sort);

List findTop10ByLastname(String lastname, Pageable pageable)
复制代码

 

 9.方法中支持的关键字

SpringdataJpa的官方API学习_第5张图片

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

Distinct去重

10.使用注解 @Query

Example 11:

public interface UserRepository extends JpaRepository {

  @Query("select u from User u where u.emailAddress = ?1")
  User findByEmailAddress(String emailAddress);
}

 Example 12:使用命名参数

public interface UserRepository extends JpaRepository {

  @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);

 

 
 
 

 

 


你可能感兴趣的:(DAO)