spring-data-jpa快速入门(二)——简单查询

一、方法名解析

  1.引言

    回顾HelloWorld项目中的dao接口

public interface GirlRepository extends JpaRepository<Girl, Integer>{
    // 新增自定义查询方法
    List<Girl> findByAge(Integer age);
}

    可以看到,这个接口中我们只是声明了方法而没有写实现,但是却是能用的,这便得益于JPA的方法名解析了

  2.简单条件查询

    按照 Spring Data 的规范,查询方法以 find | read | get 开头

    涉及条件查询时,条件的属性用条件关键字连接,要注意的是:条件属性以首字母大写

    常用的关键字如下:

And --- 等价于 SQL 中的 and 关键字,比如 findByUsernameAndPassword(String user, Striang pwd);
Or --- 等价于 SQL 中的 or 关键字,比如 findByUsernameOrAddress(String user, String addr);
Between --- 等价于 SQL 中的 between 关键字,比如 findBySalaryBetween(int max, int min);
LessThan --- 等价于 SQL 中的 "<",比如 findBySalaryLessThan(int max);
GreaterThan --- 等价于 SQL 中的">",比如 findBySalaryGreaterThan(int min);
IsNull --- 等价于 SQL 中的 "is null",比如 findByUsernameIsNull();
IsNotNull --- 等价于 SQL 中的 "is not null",比如 findByUsernameIsNotNull();
NotNull --- 与 IsNotNull 等价;
Like --- 等价于 SQL 中的 "like",比如 findByUsernameLike(String user);
StartingWith NotLike
--- 等价于 SQL 中的 "not like",比如 findByUsernameNotLike(String user); OrderBy --- 等价于 SQL 中的 "order by",比如 findByUsernameOrderBySalaryAsc(String user); Not --- 等价于 SQL 中的 "! =",比如 findByUsernameNot(String user); In --- 等价于 SQL 中的 "in",比如 findByUsernameIn(Collection<String> userList) ,方法的参数可以是 Collection 类型,也可以是数组或者不定长参数; NotIn --- 等价于 SQL 中的 "not in",比如 findByUsernameNotIn(Collection<String> userList) ,方法的参数可以是 Collection 类型,也可以是数组或者不定长参数;

    完整关键字支持,查看官方文档:点击查看

    IDEA对这方面支持非常友好!写方法解析时自动有智能提示!

    示例:

List<Girl> findByNameStartingWithAndIdLessThan(String name, Integer id);
/**
 * 1. Repository 是一个空接口. 即是一个标记接口
 * 2. 若我们定义的接口继承了 Repository, 则该接口会被 IOC 容器识别为一个 Repository Bean.
 * 纳入到 IOC 容器中. 进而可以在该接口中定义满足一定规范的方法. 
 * 
 * 3. 实际上, 也可以通过 @RepositoryDefinition 注解来替代继承 Repository 接口
 */
/**
 * 在 Repository 子接口中声明方法
 * 1. 不是随便声明的. 而需要符合一定的规范
 * 2. 查询方法以 find | read | get 开头
 * 3. 涉及条件查询时,条件的属性用条件关键字连接
 * 4. 要注意的是:条件属性以首字母大写。
 * 5. 支持属性的级联查询. 若当前类有符合条件的属性, 则优先使用, 而不使用级联属性. 
 * 若需要使用级联属性, 则属性之间使用 _ 进行连接. 
 */
//@RepositoryDefinition(domainClass=Person.class,idClass=Integer.class)
public interface PersonRepsotory extends 
    JpaRepository<Person, Integer>,
    JpaSpecificationExecutor<Person>, PersonDao{

    //根据 lastName 来获取对应的 Person
    Person getByLastName(String lastName);
    
    //WHERE lastName LIKE ?% AND id < ?
    List<Person> getByLastNameStartingWithAndIdLessThan(String lastName, Integer id);
    
    //WHERE lastName LIKE %? AND id < ?
    List<Person> getByLastNameEndingWithAndIdLessThan(String lastName, Integer id);
    
    //WHERE email IN (?, ?, ?) OR birth < ?
    List<Person> getByEmailInAndBirthLessThan(List<String> emails, Date birth);
    
    //WHERE a.id > ?
    List<Person> getByAddress_IdGreaterThan(Integer id);
更多示例

  其他的关键字也是类似,可以在控制台看到打印的SQL(配置了show sql)

  当然,缺点非常明显,方法名特别特别长!这个后期会通过JPQL进行改进!

二、自定义查询

  例如带子查询的就无法实现,这里就需要自定义SQL来进行查询了!

  参考:https://www.cnblogs.com/zj0208/p/6008627.html

原文地址:https://www.cnblogs.com/jiangbei/p/8443042.html