Spring Data JPA 4.方法定义规范
方法定义规范
简单条件查询
简单条件查询: 查询某一个实体类或者集合
按照 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.方法定义规范相关推荐
- Spring Data JPA 查询方法的命名语法与参数
3 Spring Data JPA 查询方法的命名语法与参数 在⼯作中,你是否经常为⽅法名的语义.命名规范⽽发愁?是否要为不同的查询条件写各种的 SQL 语句?是否为同⼀个实体的查询,写⼀个超级通⽤的 ...
- Spring Data JPA 查询方法支持的关键字
Table 2.3. Supported keywords inside method names Keyword Sample JPQL snippet And findByLastnameAndF ...
- ORM框架之Spring Data JPA(二)spring data jpa方式的基础增删改查
上一篇主要在介绍hibernate实现jpa规范,如何实现数据增删改查,这一篇将会着重spring data jpa 一.Spring Data JPA 1.1 Spring Data JPA介绍: ...
- JPA Spring Data JPA详解
JPA & Spring Data JPA 一.JPA 1. JPA是什么 JPA(Java Persistence API)Java持久化 API,是一套基于ORM思想的规范. ORM(Ob ...
- 使用Spring Data JPA进行分页和排序
通过代码示例学习使用Spring Data JPA进行分页和排序 . 了解如何使用Springs PagingAndSortingRepository接口获取分页和排序结果. 1概述 在处理大量数据时 ...
- spring boot + spring data jpa
Spring Data Repository的核心接口是Repository(好像也没什么好惊讶的).这个接口需要领域类(Domain Class)跟领域类的ID类型作为参数.这个接口主要是让你能知道 ...
- SpringBoot的Spring Data JPA配置
配置文件加载的优先级顺序 项目根目录下config文件夹中的配置文件 项目根目录下的配置文件 resources目录下config文件夹中的配置文件 resources目录下的配置文件 注:相应的.y ...
- Spring Data JPA方法定义规范
Spring Data Jpa方法定义的规则: findBy+属性+(关键字) (1)简单条件查询 简单条件查询:查询某一个实体类或者集合. 按照Spring Data的规范的规定,查询方法以find ...
- ORM框架之Spring Data JPA(一)Hibernate实现JPA规范
一.ORM简述 ORM(Object-Relational Mapping) 表示对象关系映射.在面向对象的软件开发中,通过ORM,就可以把对象映射到关系型数据库中.只要有一套程序能够做到建立对象与数 ...
最新文章
- 2021年2月程序员工资统计,又拖后腿了……
- POJ 1386 欧拉路的判定
- 【动态库链接】python调用C
- 【深入Java虚拟机JVM 06】垃圾收集概述
- input file 文件上传,js控制上传文件的大小和格式
- JS数组的需要注意的问题
- SQLServer数据库差异备份
- 查找对方IP地址经典技巧汇总
- python输出最大的素数_Python中的最大素数回文
- 从零开始,耗时两年,19岁小伙自制一块32位Risc-V处理器,可玩「贪吃蛇」
- 网络传输(个人整理 多网站)
- Java课程project(SMAC计算器)----基于JavaSE
- op07数据手册分析
- RAID卡原理与设置
- JAVA留言板系统(java留言板系统)java留言管理系统
- 吴明计算机二级二级试题,全国计算机二级ffice-word-历年真题.docx
- 无法从计算机验证正在安装驱动,intel CPU集显驱动失败,无法为此计算机验证正在安装的驱动程序...
- laravel框架下载指定版本
- 51--步进电机驱动代码
- 捷速OCR文字识别软件中文版