Spring Data JPA学习笔记(二)

JPA之定义查询方法

1、定义查询方法的配置方法

1)只要实体Repository集成Spring Data Common中的Repository接口即可。若想拥有更多默认通用方法实现,可选择JpaRepository、PagingAndSortingRepository、CrudRepository等接口。

    1>从名称中指定特定用于存储的查询和更新

    2>使用@Query手动定义查询

2)自定义Repository

选择性暴露CRUD方法

@NoRepositoryBeaninterface
MyBaseRepository<T, ID extends Serializable> extends Repository<T, ID>{
    T findOne(ID, id);
    T save(T entity); 
}
interface UserRepository extends MyBaseRepository<User, Long>{
    User findByEmailAddress(EmailAddress emailAddress);
}

为所有域存储库定义了一个公共基础接口,并将其暴露出来。

findOne()、save()方法将被路由到Spring Data中提供的、你选择的存储库的基本存储实现中,如SimpleJpaRepository。

UserRepository能够保存用户、通过id查找单个用户信息、通过电子邮件地址查找Users。

 

2、方法的查询策略设置

     通过@EnableJpaRepository(queryLookUpStrategy= QueryLookUpStrategy.Key.CREATE_IF_NOT_FOUND)可以配置方法的查询策略,QueryLookUpStrategy.Key的值共有3个:

    1>  CREATE: 直接根据方法名进行创建;若方法名不符合规则,就抛出异常。

    2>  USE_DECLARED_QUERY: 注解方式;启动时尝试找一个声明的查询,找不到则抛出异常。

    3>  CREATE_IF_NOT_FOUND: 默认方式;以上两种方式的结合版,先用声明方式查找,找不到则创建查询。

通常采用默认方式,不用管。

 

3、查询方法的创建

    Spring内部基础架构有根据方法名生成查询,该机制的前缀有:find...By...,read...By...,query...By...,count...By...,get...By...。

    示例:

List<User> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);

List<User> findByLastnameIgnoreCase(String lastname);

List<User> findByLastnameOrderByFirstnameAsc(String lastname);

4、关键字列表

And/Or/Is、Equals/Between/LessThan/GreaterThanEqual/

After/IsNull/Like/StartingWith/EndingWith/Containing/Not/In/True/False等等

删除前缀:deleteBy、removeBy。

5、属性表达式

//address属性中含有ZipCode属性
List<Person> findByAddressZipCode(String zipCode);
//假设Person中同时含有addressZip属性,会导致方法名分割错误,这时可以手动定义遍历点
List<Person> findByAddress_Zip(ZipCode zipCode);

6、查询结果处理

1)分页和排序

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

    限制查询结果

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

对于结果限制为仅有一个实例的查询,支持将结果包装到一个实例中的Optional中。

2)查询结果的不同形式

普通结果形式:Page、List。特殊结果形式有:

流式查询结果

@Query("select u from User u")
Stream<User> findAllByCustomQueryAndStream();
Stream<User> readAllByFirstnameNotNull();
@Query("select u from User u")
Stream<User> streamAllPaged(Pageable pageable);

异步查询结果

异步方法执行功能异步的存储库查询,方法将在调用时立即返回,实际的查询执行将发生在已提交给Spring TaskExecutor的任务中,比较适合定时任务的实际场景。

@Async
Future<User> findByFirstname(String firstname);
@Async
CompletableFuture<User> findOneByFirstname(String firstname);
@Async
ListenableFuture<User> findOneByLastname(String lastname);

Projections对查询结果的扩展

看不懂,待补充

 

7、实现机制介绍

 

发布了23 篇原创文章 · 获赞 23 · 访问量 3万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章