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、实现机制介绍

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值