Spring Data JPA最大的特色就是利用方法名定义查询方法完成CURD操作。Spring Data JPA 的 Defining Query Methods(DQM)通过方法名和参数,可以很好地解决上面的问题,也能让我们的方法名的语义更加清晰,开发效率也会提升很多。DQM 语法共有 2 种,可以实现上面的那些问题,具体如下:
若想要实现 CRUD 的操作,常规做法是写一大堆 SQL 语句。但在 JPA 里面,只需要继承 Spring Data Common 里面的任意 Repository 接口或者子接口,然后直接通过方法名就可以实现。

该语法是:带查询功能的方法名由查询策略(关键字)+ 查询字段 + 一些限制性条件组成,具有语义清晰、功能完整的特性。
你知道Spring Data JPA是如何解析方法名成SQL的么?参考一下org.springframework.data.repository.query.parser.PartTree。


所以我们在写SQL的时候,如果不知道支持哪些语法可以参考这两个类。
Spring Data JPA 为了方便我们排序和分页,支持了两个特殊类型的参数:Sort 和 Pageable。
//查询user里面的lastname=jk的第一页,每页大小是20条;并会返回一共有多少页的信息
Page users = userRepository.findByLastname("jk",PageRequest.of(1, 20));
//查询user里面的lastname=jk的第一页的20条数据,不知道一共多少条
Slice users = userRepository.findByLastname("jk",PageRequest.of(1, 20));
//查询出来所有的user里面的lastname=jk的User数据,并按照name正序返回List
List users = userRepository.findByLastname("jk",new Sort(Sort.Direction.ASC, "name"))
//按照createdAt倒序,查询前一百条User数据
List users = userRepository.findByLastname("jk",PageRequest.of(0, 100, Sort.Direction.DESC, "createdAt"));
有的时候我们想直接查询前几条数据,也不需要动态排序,那么就可以简单地在方法名字中使用 First 和 Top 关键字,来限制返回条数。
User findFirstByOrderByLastnameAsc();
User findTopByOrderByAgeDesc();
List findDistinctUserTop3ByLastname(String lastname, Pageable pageable);
List findFirst10ByLastname(String lastname, Sort sort);
List findTop10ByLastname(String lastname, Pageable pageable);
我们知道在JPA查询的时候即可以使用方法名进行查询,也可以使用@Query进行查询,那么JPA的选择策略是什么?你可能会想到,如果存在@Query会优先使用注解形式进行查询。其实JPA给我们提供了选择查询策略。
@EnableJpaRepositories(queryLookupStrategy= QueryLookupStrategy.Key.CREATE_IF_NOT_FOUND)
其中,QueryLookupStrategy.Key 的值共 3 个,具体如下:
repository是属于dao层,严格意义上来说需要经过Service包装之后才能被使用,那么如果让Service具有通用的CURD能力呢?