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还支持更复杂的查询,如使用`@Query`注解编写自定义SQL或者HQL,或者使用` Specifications`进行动态查询。此外,它还提供了事务管理、懒加载、级联操作等特性,使得数据访问更加灵活和强大。 在实际...
Spring Data JPA则是在JPA之上构建的一层抽象,它扩展了JPA的功能,提供了更多的便利。例如,Spring Data JPA支持自动化的查询生成,只需定义Repository接口,无需编写任何实现代码,就可以执行CRUD(创建、读取、...
- **环境搭建**:在 Maven 项目中添加相关依赖,包括 `spring-boot-starter-data-jpa`、数据库驱动(如 MySQL)、连接池(如 Druid),以及 Spring Boot 的父依赖 `spring-boot-starter-parent` 以统一版本管理。...
6. **Spring Boot集成**:在Spring Boot项目中,Spring Data JPA的配置非常简单,只需要在`pom.xml`添加依赖,然后在`application.properties`或`application.yml`配置数据库连接信息,Spring Boot会自动配置JPA和...
- Spring Data JPA 提供了 Querydsl 或 Specifications API 来实现动态查询,可以根据参数灵活构造查询条件。 6. **分页查询**: - Spring Data JPA 支持 Pageable 接口,可以通过 PageRequest 实例来指定分页和...
此外,Spring Data JPA与Spring Boot结合使用,可以快速搭建数据访问层。Spring Boot的自动配置特性使得设置数据库连接、数据源、JPA配置等工作变得极其简单,开发者只需少量配置就能启动应用程序。 佟刚老师的课程...
Spring Data JPA是Spring框架的一个模块,专门用于简化Java Persistence API (JPA)的使用,它使得数据库操作变得更加便捷...通过提供的各种功能,Spring Data JPA成为现代Java企业应用中处理数据持久化的首选工具之一。
SpringBoot-SpringData-jpa集成是Java开发中的一个重要主题,它结合了Spring Boot的便捷性和Spring Data JPA的高效数据库操作能力。Spring Boot简化了应用的初始设置和配置,而Spring Data JPA则提供了对数据库操作...
- **gs-accessing-data-jpa**:这是一个简单的Spring Boot应用,展示了如何配置Spring Data JPA并创建第一个Repository。 - **spring-data-jpa-examples**:可能包含多个示例,演示了不同类型的查询和数据操作。 ...
Spring Boot提供了一系列强大的工具,如JPA、Hibernate、Spring Data和JdbcTemplate,来简化这一过程。让我们深入探讨这些技术以及它们在实际项目中的应用。 1. **JPA(Java Persistence API)**: JPA是Java平台...
9. **Integration with Spring Boot**:Spring Boot提供了开箱即用的Spring Data JPA配置,只需在pom.xml或build.gradle中添加依赖,然后在application.properties或application.yml中配置数据源,即可快速启动JPA...
6. **Integration with Spring Boot**: 如果例子中包含 Spring Boot,那么可以看到如何在 Spring Boot 应用中配置 Spring Data JPA,包括数据源配置、JPA 配置以及自动配置的使用。 7. **Auditing**: Spring Data ...
Spring Data JPA是Spring Data项目的一部分,它构建在JPA之上,提供了一种声明式的方式来处理数据访问。通过简单的接口定义,即可自动实现数据查询、存储等功能,极大地减少了手动编写DAO(Data Access Object)层的...
SpringBoot 整合 JPA(Java ...在实际项目中,还可以结合Spring Data JPA的其他高级特性,如 Specifications、JPA Repositories 自定义查询,以及使用Spring Security进行权限控制等,以满足更复杂的业务需求。
本项目是一个仓库管理系统,它利用了Spring Boot的强大特性,结合Spring Data JPA来简化数据库操作,实现了高效的数据管理和查询。 【描述】:仓库管理系统采用Spring Boot作为基础框架,Spring Data JPA作为数据...
在实际项目中,还可以利用Spring Data JPA的高级查询功能,如方法命名查询和 Specifications API,来构建复杂的查询条件。 总的来说,“简单的spring整合JPA”涉及的是Spring框架与Java持久化API的融合,让开发者...
《Spring Boot参考指南2.0.4》与《Spring Data JPA参考文档》是Spring框架开发者的重要参考资料,它们深入解析了Spring Boot和Spring Data JPA的核心概念与实践应用。 Spring Boot是Spring生态系统的简化版,它旨在...
Spring Data JPA还提供了其他高级特性,如Querydsl、 Specifications等,它们允许更复杂的查询构造。Querydsl提供了一个强大的类型安全的查询API,而Specifications则允许在运行时动态构建查询条件,这对于复杂查询...
Spring JPA,全称为Spring Data JPA,是Spring框架的一部分,用于简化Java Persistence API(JPA)的使用。它提供了一种声明式的方式来处理数据库交互,使得开发人员无需编写大量的SQL代码,就能实现数据的增删改查...
《SpringDataJpa实战:基于boot-jpa.zip的深度解析》 在Java世界里,Spring Data JPA作为一款强大的ORM框架,极大地简化了数据库操作,它整合了Spring Framework与Hibernate等JPA实现,使得开发者可以专注于业务...