您的位置:首页 > 编程语言 > Java开发

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

2018-02-11 19:26 726 查看

一、方法名解析

  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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: