Specifications 的思路来自于“领域驱动设计”的概念,通过可编程的方式实现查询的where语句。我们今天就来写一个Specification的例子。
一、首先建立一个Spring Boot 工程
我们使用的IDE是InteliJ IDEA,开发语言是Kotlin,
Spring 的工程特性选择了JPA、Rest Repository和一种数据库支持(这里是MySql)
新建项目没有什么可说的,接下来我们正式进入编码:
二、编写一个实体类来记录数据
我们使用一个Record实体来保存数据,包含了名称和值,代码如下:
package cn.techcave.demo.jpa3.domain
import javax.persistence.Entity
import javax.persistence.GeneratedValue
import javax.persistence.GenerationType
import javax.persistence.Id
@Entity
class Record(
/**
* 主键
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id:Long? = null,
/**
* 名称
*/
var name:String? = null,
/**
* 值
*/
var value:Double? = null
)
三、通过接口实现Specification的支持
要使我们的Repository支持Specification查询,需要在Repository中继承JpaSpecificationExecutor接口,代码如下:
package cn.techcave.demo.jpa3.repository
import cn.techcave.demo.jpa3.domain.Record
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.jpa.repository.JpaSpecificationExecutor
import org.springframework.stereotype.Repository
@Repository
interface RecordRepo:JpaRepository<Record, Long>, JpaSpecificationExecutor<Record>{
}
四、通过JPA 2 的criteria API实现Specifications查询
Repository支持了Specifications查询,我们在代码中实现查询,如下代码所示:
package cn.techcave.demo.jpa3.service
import cn.techcave.demo.jpa3.domain.Record
import cn.techcave.demo.jpa3.repository.RecordRepo
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
import java.time.LocalDate
import javax.persistence.criteria.CriteriaBuilder
import javax.persistence.criteria.Root
import org.springframework.data.jpa.domain.Specification
import org.springframework.data.jpa.domain.Specifications.where
import javax.persistence.criteria.CriteriaQuery
import javax.persistence.criteria.Predicate
@Service
class RecordService {
@Autowired
lateinit var recordRepo: RecordRepo
fun nameLike(name:String): Specification<Record> {
return object : Specification<Record> {
override fun toPredicate(root: Root<Record>, query: CriteriaQuery<*>,
builder: CriteriaBuilder): Predicate {
return builder.like(root.get("name"),"%$name%")
}
}
}
fun filterByName(name:String) = recordRepo.findAll(nameLike(name))
fun filterByNames(n1:String, n2:String) :List<Record> {
return recordRepo.findAll(where(nameLike(n1)).or(nameLike(n2)))
}
fun findAll() = recordRepo.findAll()
}
上面的代码中,我们首先编写nameLike方法,返回一个基于名称的Specification查询。然后我们在filterByName中执行此查询。Specification还可以进行组合条件的查询,例如filterByNames方法,我们用or组合了两个nameLike的Specification。
五、测试
我们用REST发布我们的查询功能,代码如下:
package cn.techcave.demo.jpa3.web
import cn.techcave.demo.jpa3.service.RecordService
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RestController
@RestController
class RecordController {
@Autowired
lateinit var recordSvc:RecordService
@GetMapping("findAll")
fun findAll() = recordSvc.findAll()
@GetMapping("findByName")
fun findByName(name:String) = recordSvc.filterByName(name)
@GetMapping("findByNames")
fun findByNames(n1:String, n2:String) = recordSvc.filterByNames(n1, n2)
}
然后,我们在这里手工做一些数据用于测试:
用Postman调用REST接口,首先是findAll,可以看到所有数据被查询出来了:
然后findByName,包含查询参数name的值被查询出来了:
findByNames,这里测试或验收的是组合查询,两个组合条件都是包含名称,当然也可以使用其他查询条件:
相关推荐
Spring Data JPA API。 Spring Data JPA 开发文档。 官网 Spring Data JPA API。
Spring Boot使用spring-data-jpa配置Mysql多数据源,可用版本
该案例使用SpringBoot 整合了SPringData JPA,使用SpringData 开发简化了Dao层的开发量,简化了数据访问,使得持久化更加简单 !
Spring Boot+Maven+Spring Data JPA+apache Shiro+Easyui实现通用用户权限管理系统
spring注解完整版+spring data jpa官方文档中文翻译+JPA2.0官方文档 文档内容齐全 值得参考学习
NULL 博文链接:https://mixo44.iteye.com/blog/1797079
Spring Boot 系列教程 Data JPA
Spring Data JPA中文文档1.4.3
Spring Boot+Spring Data Jpa进销存系统;本系统使用Spring Boot架构,数据访问层采用Spring Data Jpa,安全框架采用Shiro,实现了完整权限系统,Controller方法采用Shiro注解,来实现有效的权限控制;界面采用了...
5-Spring-Boot(五):spring data jpa的使用.docx5-Spring-Boot(五):spring data jpa的使用.docx5-Spring-Boot(五):spring data jpa的使用.docx5-Spring-Boot(五):spring data jpa的使用.docx5-Spring-Boot(五):...
#boot-jpa-security-dmdb-freemark spring boot spring security 达梦数据库 ftl assembly 打包
spring boot 集成activemq Datajpa Ehcache 里面有详细的例子
ng-spring-boot, Spring Boot Spring Data JPA AngularJS示例 采用 Spring Boot 和AngularJS的快速Prototype快速 Prototype这个例子演示了英镑 Spring Boot Spring Data JPA 和前端可以一起用来编写web应用程序的...
java运行依赖jar包
第四章节 Spring Boot 整合 Spring Data JPA(SpringBoot 高级)一、Spring Data JPA 介绍Spring Dat
spring+springmvc+spring data jpa+mysql代码示例。运行前需创建数据库sssp并修改相关数据库配置
'SpringDataJPA从入门到精通'分为12章 内容包括整体认识JPA、JPA基础查询方法、定义查询方法、注解式查询方法、@Entity实例里面常用注解详解、JpaRepository扩展详解、JPA的MVC扩展REST支持、DataSource的配置、乐观...
管理系统系列--基于spring boot脚手架项目,spring data jpa+Spring Boot2+bo
赠送jar包:spring-data-jpa-2.0.9.RELEASE.jar; 赠送原API文档:spring-data-jpa-2.0.9.RELEASE-javadoc.jar; 赠送源代码:spring-data-jpa-2.0.9.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-data-jpa...
spring data jpa最新版本1.8.0,包含了spring-data-jpa-1.8.0.RELEASE.jar,spring-data-jpa-1.8.0.RELEASE-javadoc.jar以及 spring-data-jpa-1.8.0.RELEASE-sources.jar文档和源代码