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