方法定义规范

简单条件查询

  • 简单条件查询: 查询某一个实体类或者集合

  • 按照 Spring Data 的规范,查询方法以 find | read | get 开头, 涉及条件查询时,条件的属性用条件关键字连接,要注意的是:条件属性以首字母大写。

  • 例如:定义一个 Entity 实体类 :

class User{ private String firstName; private String lastName;} 

使用And条件连接时,应这样写: findByLastNameAndFirstName(String lastName,String firstName); 条件的属性名称与个数要与参数的位置与个数一一对应

支持的关键字

直接在接口中定义查询方法,如果是符合规范的,可以不用写实现,目前支持的关键字写法如下:

查询方法解析流程

  • 假如创建如下的查询:findByUserDepUuid(),框架在解析该方法时,首先剔除 findBy,然后对剩下的属性进行解析,假设查询实体为Doc

    • 先判断 userDepUuid (根据 POJO 规范,首字母变为小写)是否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,继续第二步;

    • 从右往左截取第一个大写字母开头的字符串(此处为Uuid),然后检查剩下的字符串是否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,则重复第二步,继续从右往左截取;最后假设 user 为查询实体的一个属性;

    • 接着处理剩下部分(DepUuid),先判断 user 所对应的类型是否有depUuid属性,如果有,则表示该方法最终是根据 “ Doc.user.depUuid” 的取值进行查询;否则继续按照步骤 2 的规则从右往左截取,最终表示根据 “Doc.user.dep.uuid” 的值进行查询。

    • 可能会存在一种特殊情况,比如 Doc包含一个 user 的属性,也有一个 userDep 属性,此时会存在混淆。可以明确在属性之间加上 “_” 以显式表达意图,比如 “findByUser_DepUuid()” 或者 “findByUserDep_uuid()”

  • 特殊的参数: 还可以直接在方法的参数上加入分页或排序的参数,比如:

    • Page<UserModel> findByName(String name, Pageable pageable);

    • List<UserModel> findByName(String name, Sort sort);

代码示例:

  • entity类: Person.java

package com.ifox.hgx.springdata.entities;import org.springframework.format.annotation.DateTimeFormat;
import javax.persistence.*;
import java.util.Date;@Table(name = "JPA_PERSONS")
@Entity
public class Person {private Integer id ;private String lastName ;private String email ;private Date birth ;private Integer age ;private Address address;@GeneratedValue(strategy = GenerationType.IDENTITY)@Idpublic Integer getId() {return id;}public void setId(Integer id) {this.id = id;}@Column(name = "LAST_NAME")public String getLastName() {return lastName;}public void setLastName(String lastName) {this.lastName = lastName;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}@DateTimeFormatpublic Date getBirth() {return birth;}public void setBirth(Date birth) {this.birth = birth;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@JoinColumn(name = "ADDRESS_ID")@ManyToOnepublic Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}@Overridepublic String toString() {return "Person{" +"id=" + id +", lastName='" + lastName + '\'' +", email='" + email + '\'' +", birth=" + birth +", age=" + age +", address=" + address +'}';}
}
  • entity类:Address.java

package com.ifox.hgx.springdata.entities;import javax.persistence.*;/*** @Author hanguixian* @Date Created in 21:12 2018/7/4*/
@Table(name="JPA_ADDRESSES")
@Entity
public class Address {private Integer id;private String province;private String city;@GeneratedValue(strategy = GenerationType.IDENTITY)@Idpublic Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getProvince() {return province;}public void setProvince(String province) {this.province = province;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}@Overridepublic String toString() {return "Address{" +"id=" + id +", province='" + province + '\'' +", city='" + city + '\'' +'}';}
}
  • dao层:

package com.ifox.hgx.springdata.dao;import com.ifox.hgx.springdata.entities.Person;
import org.springframework.data.repository.Repository;
import java.util.Date;
import java.util.List;/*** 在 Repository 子接口中声明方法* 1. 不是随便声明的. 而需要符合一定的规范* 2. 查询方法以 find | read | get 开头* 3. 涉及条件查询时,条件的属性用条件关键字连接* 4. 要注意的是:条件属性以首字母大写。* 5. 支持属性的级联查询. 若当前类有符合条件的属性, 则优先使用, 而不使用级联属性.* 若需要使用级联属性, 则属性之间使用 _ 进行连接.*/
public interface PersonRepository extends Repository<Person,Integer> {//根据 lastName 来获取对应的 PersonPerson 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);}
  • 测试类:SpringDataTest.java

package com.ifox.hgx.jap.spring;import com.ifox.hgx.springdata.dao.PersonRepository;
import com.ifox.hgx.springdata.entities.Person;
import com.ifox.hgx.springdata.service.PersonService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import javax.sql.DataSource;
import java.sql.Connection;
import java.util.Arrays;
import java.util.Date;
import java.util.List;public class SpringDataTest {private ApplicationContext applicationContext = null;private PersonService personService = null;private PersonRepository personRepository = null;{applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");personService = applicationContext.getBean(PersonService.class);personRepository = applicationContext.getBean(PersonRepository.class) ;}@Testpublic void testDataSource() throws Exception {DataSource dataSource = applicationContext.getBean(DataSource.class);Connection connection = dataSource.getConnection();System.out.println(connection);}@Testpublic void testPersonFindByLastName() {Person person = personService.getByLastName("sjsja");System.out.println(person);}
//关注此处测试@Testpublic void testKeyWords() {List<Person> persons = personRepository.getByLastNameStartingWithAndIdLessThan("A", 5);System.out.println(persons);List<Person>  persons2 = personRepository.getByLastNameEndingWithAndIdLessThan("C",40) ;System.out.println(persons2);List<Person> people  = personRepository.getByEmailInAndBirthLessThan(Arrays.asList("aa@qq.com","bb@qq.com","cc@qq.com"),new Date()) ;System.out.println(people);List<Person> people1 = personRepository.getByAddress_IdGreaterThan(2) ;System.out.println(people1);}
}
  • 数据测试数据:

Spring Data JPA 4.方法定义规范相关推荐

  1. Spring Data JPA 查询方法的命名语法与参数

    3 Spring Data JPA 查询方法的命名语法与参数 在⼯作中,你是否经常为⽅法名的语义.命名规范⽽发愁?是否要为不同的查询条件写各种的 SQL 语句?是否为同⼀个实体的查询,写⼀个超级通⽤的 ...

  2. Spring Data JPA 查询方法支持的关键字

    Table 2.3. Supported keywords inside method names Keyword Sample JPQL snippet And findByLastnameAndF ...

  3. ORM框架之Spring Data JPA(二)spring data jpa方式的基础增删改查

    上一篇主要在介绍hibernate实现jpa规范,如何实现数据增删改查,这一篇将会着重spring data jpa 一.Spring Data JPA 1.1 Spring Data JPA介绍: ...

  4. JPA Spring Data JPA详解

    JPA & Spring Data JPA 一.JPA 1. JPA是什么 JPA(Java Persistence API)Java持久化 API,是一套基于ORM思想的规范. ORM(Ob ...

  5. 使用Spring Data JPA进行分页和排序

    通过代码示例学习使用Spring Data JPA进行分页和排序 . 了解如何使用Springs PagingAndSortingRepository接口获取分页和排序结果. 1概述 在处理大量数据时 ...

  6. spring boot + spring data jpa

    Spring Data Repository的核心接口是Repository(好像也没什么好惊讶的).这个接口需要领域类(Domain Class)跟领域类的ID类型作为参数.这个接口主要是让你能知道 ...

  7. SpringBoot的Spring Data JPA配置

    配置文件加载的优先级顺序 项目根目录下config文件夹中的配置文件 项目根目录下的配置文件 resources目录下config文件夹中的配置文件 resources目录下的配置文件 注:相应的.y ...

  8. Spring Data JPA方法定义规范

    Spring Data Jpa方法定义的规则: findBy+属性+(关键字) (1)简单条件查询 简单条件查询:查询某一个实体类或者集合. 按照Spring Data的规范的规定,查询方法以find ...

  9. ORM框架之Spring Data JPA(一)Hibernate实现JPA规范

    一.ORM简述 ORM(Object-Relational Mapping) 表示对象关系映射.在面向对象的软件开发中,通过ORM,就可以把对象映射到关系型数据库中.只要有一套程序能够做到建立对象与数 ...

最新文章

  1. 2021年2月程序员工资统计,又拖后腿了……
  2. POJ 1386 欧拉路的判定
  3. 【动态库链接】python调用C
  4. 【深入Java虚拟机JVM 06】垃圾收集概述
  5. input file 文件上传,js控制上传文件的大小和格式
  6. JS数组的需要注意的问题
  7. SQLServer数据库差异备份
  8. 查找对方IP地址经典技巧汇总
  9. python输出最大的素数_Python中的最大素数回文
  10. 从零开始,耗时两年,19岁小伙自制一块32位Risc-V处理器,可玩「贪吃蛇」
  11. 网络传输(个人整理 多网站)
  12. Java课程project(SMAC计算器)----基于JavaSE
  13. op07数据手册分析
  14. RAID卡原理与设置
  15. JAVA留言板系统(java留言板系统)java留言管理系统
  16. 吴明计算机二级二级试题,全国计算机二级ffice-word-历年真题.docx
  17. 无法从计算机验证正在安装驱动,intel CPU集显驱动失败,无法为此计算机验证正在安装的驱动程序...
  18. laravel框架下载指定版本
  19. 51--步进电机驱动代码
  20. 捷速OCR文字识别软件中文版

热门文章

  1. bars 除障句完整_精选每日一句早安问候语语录49句
  2. 三羊献瑞-第六届蓝桥杯省赛
  3. HDUOJ 6575 Budget
  4. initial、inherit、unset、revert和all的区别
  5. 蓝桥杯第八届真题 :迷宫
  6. 今日金融词汇---仓位,是什么?
  7. 我的第一篇博客(激动无比!!!)
  8. 如何用Python判断某年某月有多少天
  9. win7 正在锁定计算机 卡住,win7关机关不掉怎么办_win7一直卡在关机的解决办法
  10. 第一章计算机网络体系结构(二)