springDataJpa的官方API
作者:互联网
一 . Core concepts(核心概念)
1.springdata中的中心接口是——Repository。这个接口没有什么重要的功能(原句称没什么惊喜的一个接口)。主要的作用就是标记和管理。其他的接口都是此接口的子类。
Example 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,增加了一些方法来实现分页。
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 }
2)除了普通查询,计数和删除查询都可以使用
Example 4:计数查询
dao:
controller:
Example 5:派生删除查询
dao:
controller:
3.查询数据
4.定义dao层的继承接口
通常,dao层接口将会继承Repository,CrudRepository 或者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…By
,read…By
,query…By
,count…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表示引用属性进行查找时附加子句并提供排序方向(Asc或Desc)
7.关于特殊参数的处理(比如Pageable和Sort 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.方法中支持的关键字
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.方法中支持的关键字,详情见慕课网springData,Reposotory查询方法命名规则
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);
标签:springDataJpa,String,lastname,官方,List,API,User,Example,Pageable 来源: https://www.cnblogs.com/panzai/p/11741256.html