`

Spring Boot 之 Spring Data JPA 三(Specifications)

阅读更多

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,可以看到所有数据被查询出来了:

 
findAll结果

然后findByName,包含查询参数name的值被查询出来了:

 

 
findByName结果

findByNames,这里测试或验收的是组合查询,两个组合条件都是包含名称,当然也可以使用其他查询条件:

 

 
findByNames组合查询结果

原文地址

分享到:
评论

相关推荐

    Spring Boot整合SpringDataJPA

    Spring Data JPA还支持更复杂的查询,如使用`@Query`注解编写自定义SQL或者HQL,或者使用` Specifications`进行动态查询。此外,它还提供了事务管理、懒加载、级联操作等特性,使得数据访问更加灵活和强大。 在实际...

    Spring Data JPA 笔记

    Spring Data JPA则是在JPA之上构建的一层抽象,它扩展了JPA的功能,提供了更多的便利。例如,Spring Data JPA支持自动化的查询生成,只需定义Repository接口,无需编写任何实现代码,就可以执行CRUD(创建、读取、...

    整合Spring Data JPA1

    - **环境搭建**:在 Maven 项目中添加相关依赖,包括 `spring-boot-starter-data-jpa`、数据库驱动(如 MySQL)、连接池(如 Druid),以及 Spring Boot 的父依赖 `spring-boot-starter-parent` 以统一版本管理。...

    Spring Data JPA

    6. **Spring Boot集成**:在Spring Boot项目中,Spring Data JPA的配置非常简单,只需要在`pom.xml`添加依赖,然后在`application.properties`或`application.yml`配置数据库连接信息,Spring Boot会自动配置JPA和...

    springboot+spring-data-jpa maven项目

    - Spring Data JPA 提供了 Querydsl 或 Specifications API 来实现动态查询,可以根据参数灵活构造查询条件。 6. **分页查询**: - Spring Data JPA 支持 Pageable 接口,可以通过 PageRequest 实例来指定分页和...

    尚硅谷 佟刚 spring_data+jpa pdf 资源

    此外,Spring Data JPA与Spring Boot结合使用,可以快速搭建数据访问层。Spring Boot的自动配置特性使得设置数据库连接、数据源、JPA配置等工作变得极其简单,开发者只需少量配置就能启动应用程序。 佟刚老师的课程...

    spring-data Jpa Jar包

    Spring Data JPA是Spring框架的一个模块,专门用于简化Java Persistence API (JPA)的使用,它使得数据库操作变得更加便捷...通过提供的各种功能,Spring Data JPA成为现代Java企业应用中处理数据持久化的首选工具之一。

    SpringBoot-SpringData-jpa集成

    SpringBoot-SpringData-jpa集成是Java开发中的一个重要主题,它结合了Spring Boot的便捷性和Spring Data JPA的高效数据库操作能力。Spring Boot简化了应用的初始设置和配置,而Spring Data JPA则提供了对数据库操作...

    spring data jpa 案例

    - **gs-accessing-data-jpa**:这是一个简单的Spring Boot应用,展示了如何配置Spring Data JPA并创建第一个Repository。 - **spring-data-jpa-examples**:可能包含多个示例,演示了不同类型的查询和数据操作。 ...

    springboot,jpa,spring data,jdbc template使用代码

    Spring Boot提供了一系列强大的工具,如JPA、Hibernate、Spring Data和JdbcTemplate,来简化这一过程。让我们深入探讨这些技术以及它们在实际项目中的应用。 1. **JPA(Java Persistence API)**: JPA是Java平台...

    SpringDataJpa.rar

    9. **Integration with Spring Boot**:Spring Boot提供了开箱即用的Spring Data JPA配置,只需在pom.xml或build.gradle中添加依赖,然后在application.properties或application.yml中配置数据源,即可快速启动JPA...

    Spring-data-jpa示例源码

    6. **Integration with Spring Boot**: 如果例子中包含 Spring Boot,那么可以看到如何在 Spring Boot 应用中配置 Spring Data JPA,包括数据源配置、JPA 配置以及自动配置的使用。 7. **Auditing**: Spring Data ...

    Spring-data-jpa常用教程

    Spring Data JPA是Spring Data项目的一部分,它构建在JPA之上,提供了一种声明式的方式来处理数据访问。通过简单的接口定义,即可自动实现数据查询、存储等功能,极大地减少了手动编写DAO(Data Access Object)层的...

    springboot整合jpa

    SpringBoot 整合 JPA(Java ...在实际项目中,还可以结合Spring Data JPA的其他高级特性,如 Specifications、JPA Repositories 自定义查询,以及使用Spring Security进行权限控制等,以满足更复杂的业务需求。

    仓库管理系统,SpringBoot+Spring Data JPA+......zip

    本项目是一个仓库管理系统,它利用了Spring Boot的强大特性,结合Spring Data JPA来简化数据库操作,实现了高效的数据管理和查询。 【描述】:仓库管理系统采用Spring Boot作为基础框架,Spring Data JPA作为数据...

    简单的spring整合JPA

    在实际项目中,还可以利用Spring Data JPA的高级查询功能,如方法命名查询和 Specifications API,来构建复杂的查询条件。 总的来说,“简单的spring整合JPA”涉及的是Spring框架与Java持久化API的融合,让开发者...

    spring-boot-reference-2.04 springBoot文档

    《Spring Boot参考指南2.0.4》与《Spring Data JPA参考文档》是Spring框架开发者的重要参考资料,它们深入解析了Spring Boot和Spring Data JPA的核心概念与实践应用。 Spring Boot是Spring生态系统的简化版,它旨在...

    springboot-spring-data-jpa.zip

    Spring Data JPA还提供了其他高级特性,如Querydsl、 Specifications等,它们允许更复杂的查询构造。Querydsl提供了一个强大的类型安全的查询API,而Specifications则允许在运行时动态构建查询条件,这对于复杂查询...

    spring jpa

    Spring JPA,全称为Spring Data JPA,是Spring框架的一部分,用于简化Java Persistence API(JPA)的使用。它提供了一种声明式的方式来处理数据库交互,使得开发人员无需编写大量的SQL代码,就能实现数据的增删改查...

    boot-jpa.zip

    《SpringDataJpa实战:基于boot-jpa.zip的深度解析》 在Java世界里,Spring Data JPA作为一款强大的ORM框架,极大地简化了数据库操作,它整合了Spring Framework与Hibernate等JPA实现,使得开发者可以专注于业务...

Global site tag (gtag.js) - Google Analytics