Spring Data JPA【JpaSpecificationExecutor】多条件动态查询简单示例

spring data jpa 动态分页查询多表多条件复杂查询实现 本篇文章重点解决通过jpa实现动态分页多表复杂查询的实现 公司现在用的spring data jpa作为后台运营框架 ,通过下图jpa封装的这五个方法虽然就可以实现动态分页查询,(关于这个接口的使用网上一大堆,这里就不再赘述了),但是如果不重写Specification中的toPredicate方法(重写toPredicate方法还要按照他的规则用代码拼接sql,太麻烦…)仅仅可以实现单表的查询... 阅读详情

1. 表结构

CREATE TABLE `user` (
  `uid` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  PRIMARY KEY (`uid`),
  UNIQUE KEY `UK_USER_NAME` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
INSERT INTO `test`.`user`(`uid`, `username`, `password`) VALUES (1, 'neau', 'neau');
INSERT INTO `test`.`user`(`uid`, `username`, `password`) VALUES (2, 'First', 'First');
INSERT INTO `test`.`user`(`uid`, `username`, `password`) VALUES (4, 'Sec', 'First');
INSERT INTO `test`.`user`(`uid`, `username`, `password`) VALUES (5, 'Sec0', 'First');
INSERT INTO `test`.`user`(`uid`, `username`, `password`) VALUES (6, 'Sec00', 'First');
INSERT INTO `test`.`user`(`uid`, `username`, `password`) VALUES (7, '11c00', 'First');
INSERT INTO `test`.`user`(`uid`, `username`, `password`) VALUES (8, '142400', 'First');
INSERT INTO `test`.`user`(`uid`, `username`, `password`) VALUES (9, '144200', 'First');
INSERT INTO `test`.`user`(`uid`, `username`, `password`) VALUES (10, '14', 'First');
INSERT INTO `test`.`user`(`uid`, `username`, `password`) VALUES (11, 'll4', 'First');
INSERT INTO `test`.`user`(`uid`, `username`, `password`) VALUES (12, 'ii', 'First');
INSERT INTO `test`.`user`(`uid`, `username`, `password`) VALUES (13, 'ii2', 'First');
INSERT INTO `test`.`user`(`uid`, `username`, `password`) VALUES (14, 'ii27', 'First');
INSERT INTO `test`.`user`(`uid`, `username`, `password`) VALUES (15, 'ii2o7', 'First');

表内容

2. 实体类 @Entity

package top.actim.springdata.pojo;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.io.Serializable;

@Entity
public class User implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int uid;
    private String username;
    private String password;

    public User() {
    }

    public User(int uid, String username, String password) {
        this.uid = uid;
        this.username = username;
        this.password = password;
    }

    public int getUid() {
        return uid;
    }

    public void setUid(int uid) {
        this.uid = uid;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "uid=" + uid +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

3. DAO层接口

package top.actim.springdata.dao;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import top.actim.springdata.pojo.User;

public interface UserRepository 
extends JpaRepository<User, Integer>, JpaSpecificationExecutor<User> {
    // 无需写方法,JpaRepository包含基本增删改查分页等功能,JpaSpecificationExecutor包含复杂条件查询接收方法
    // 自定义规范方法
    User findByUsername(String username);
}

4. Service组合查询条件

分页、uid大于5

package top.actim.springdata.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import top.actim.springdata.dao.UserRepository;
import top.actim.springdata.pojo.User;

import javax.persistence.criteria.*;

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public User addNewUser(String username, String password) {
        User n = new User();
        n.setUsername(username);
        n.setPassword(password);
        userRepository.save(n);
        return n;
    }

    public Iterable<User> getAllUsers() {
        return userRepository.findAll();
    }

    public User getByUsername(String username) {
        return userRepository.findByUsername(username);
    }

    // 分页查询uid大于5的User
    public Page<User> getByUidGt5(){
        // 分页参数 降序、页码、页容量
        Sort sort = new Sort(Sort.Direction.DESC,"uid");
        int page = 1;
        int pageSize = 5;
        Pageable pageable = PageRequest.of(page,pageSize,sort);

        //通常使用 Specification(条件) 的匿名内部类
        Specification<User> specification = new Specification<User>() {
            /**
             * @param *root: 代表查询的实体类.
             * @param query: 可以从中得到 Root 对象,
             * 即告知 JPA Criteria 查询要查询哪一个实体类.
             * 还可以来添加查询条件, 还可以结合 EntityManager 对象得到最终查询的 TypedQuery 对象.
             * @param *cb: CriteriaBuilder 对象.
             * 用于创建 Criteria 相关对象的工厂.
             * 当然可以从中获取到 Predicate 对象
             * @return: *Predicate 类型, 代表一个查询条件.
             */
            @Override
            public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                Path path = root.get("uid");// 字段
                Predicate predicate = cb.gt(path, 5);// 大于5
                return predicate;
            }
        };

        // 调用查询方法,加入条件参数、分页参数
        Page<User> userPage = userRepository.findAll(specification,  pageable);
        return userPage;
    }
}

5. Controller

package top.actim.springdata.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import top.actim.springdata.pojo.User;
import top.actim.springdata.service.UserService;

@Controller
@RequestMapping("user")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping(path = "/add")
    @ResponseBody
    public User addNewUser(@RequestParam String username, @RequestParam String password) {
        return userService.addNewUser(username, password);
    }

    @GetMapping(path = "/all")
    @ResponseBody
    public Iterable<User> getAllUsers() {
        return userService.getAllUsers();
    }

    @GetMapping(path = "/name")
    @ResponseBody
    public User getUserByName(String username) {
        return userService.getByUsername(username);
    }

    @GetMapping(path = "/uid/gt5")
    @ResponseBody //测试
    public Page<User> getByUidGt5() {
        return userService.getByUidGt5();
    }

}

6. 测试

启动程序
用浏览器访问 http://localhost:8080/user/uid/gt5

{"content":[{"uid":10,"username":"14","password":"First"},{"uid":9,"username":"144200","password":"First"},{"uid":8,"username":"142400","password":"First"},{"uid":7,"username":"11c00","password":"First"},{"uid":6,"username":"Sec00","password":"First"}],"pageable":{"sort":{"sorted":true,"unsorted":false,"empty":false},"offset":5,"pageSize":5,"pageNumber":1,"paged":true,"unpaged":false},"last":true,"totalPages":2,"totalElements":10,"number":1,"size":5,"sort":{"sorted":true,"unsorted":false,"empty":false},"numberOfElements":5,"first":false,"empty":false}

7. 参考文章

Spring Data JPA之JpaSpecificationExecutor复杂动态查询实例
JpaSpecificationExecutor实现带查询条件的分页排序【详细】


Spring Data JPA入门简解与XML配置实现
SpringBoot + SpringData JPA + MySQL 的快速开始实例

Spring data jpa 的使用与详解:复杂动态查询及分页,排序 一、 使用Specification实现复杂查询 (1) 什么是Specification Specification是springDateJpa中的一个接口,他是用于当jpa的一些基本CRUD操作的扩展,可以把他理解成一个spring jpa的复杂查询接口。其次我们需要了解Criteria 查询,这是是一种类型安全和更面向对象的查询。而Spring Data JPA支持JPA2.0的Criteria查询,相应的接口是JpaSpecificationExecutor。 而JpaSpecificationEx 阅读详情

相关推荐

Spring Data JPA动态查询:JpaSpecificationExecutor详解

JPA规范作为Java持久层标准,其动态查询能力是解决复杂业务筛选的关键技术。通过Criteria API实现的类型安全查询构建,避免了传统SQL拼接的安全风险。JpaSpecificationExecutor接口基于领域驱动设计的Specification模式,将查询条件对象化,支持条件复用与灵活组合。在后台管理系统、数据分析报表等需要动态构建查询的场景中,该技术能显著提升代码可维护性。结合N+1查询优化、二级缓存配置等工程实践技巧,可构建高性能的数据访问层。Spring Data JPA 4.0引入的P

weixin_34242509的博客 426

jpa批量删除数据_Spring Data Jpa批量插入数据

团队目前数据库持久层用的都是Spring Data Jpa。jpa自带的批量保存数据saveAll()方法,本质上是循环调用save()方法。随着一些高频读写数据库的业务出现,写数据速度逐渐不满足要求。有三种方式解决这个问题:通过扩展jpa实现批量保存数据;使用jdbc操作批量数据;换MyBatis。1. 直接上代码实体类:import javax.persistence.Entity;impor...

weixin_30785057的博客 829

Spring Data JPA + Pgsql 实现多条件搜索查询

目录 目标: web上能根据多个输入条件查询出正确的数据 结构:Spring Data JPA + Pgsql +JS 实现方式:用JpaSpecificationExecutor 接口 实现代码: 表 HTML Part JS Part Dao Part Service Part 结果展示:​ 目标: web上能根据多个输入条件查询出正确的数据 结构:Spring Data JPA + Pgsql +JS 实现方式:用JpaSpecificationExecuto...

qq_33744949的博客 1323

Jpa,关于JpaSpecificationExecutor<>的动态查询

【1】配置和JAR包和之前的jpa单表查询一样,这里就不导入代码了 【2】有时我们在查询某个实体的时候,给定的条件是不固定的,这时就需要动态构建相应的查询语句,在Spring Data JPA中可以通过JpaSpecificationExecutor接口查询。相比JPQL,其优势是类型安全,更加的面向对象。 这里我们要是用到Test单元测试,记得把这两个注解加到类前,不然不能使用Spring的配置 @RunWith(SpringJUnit4ClassRunner.class) @C...

Hpeacheng的博客 1494

Spring Data JPA动态查询:JpaSpecificationExecutor实战指南

在Java持久层开发中,动态查询是处理复杂业务场景的核心需求。JPA Criteria API通过面向对象的方式构建类型安全的查询条件,解决了传统JPQL字符串拼接带来的维护难题。Spring Data JPA进一步封装为JpaSpecificationExecutor接口,使得动态条件组合、分页排序等操作更加工程化。特别是在电商、ERP等需要灵活筛选的系统里,该技术能减少70%以上的重复代码。通过元模型(metamodel)实现编译期字段检查,配合Lambda表达式简化开发,大幅提升了查询构建的可靠性和开

weixin_33924220的博客 371

Benchmark系列——UnixBench测试项深度解析与性能优化指南

本文深度解析UnixBench基准测试套件的各项测试原理,包括Dhrystone、Whetstone、系统调用、进程管理、IPC及文件I/O等核心测试项。通过详细的测试项分析,指导用户解读测试报告,并提供针对性的内核参数调整、编译优化及系统配置实战指南,帮助用户精准定位并优化系统性能瓶颈。

weixin_29230901的博客 275

Spring Data Jpa 之Specification 动态查询

Specifications动态查询 public interface JpaSpecificationExecutor<T> { Optional<T> findOne(@Nullable Specification<T> spec);//查询单个对象 List<T> findAll(@Nullable Specification<T> spec);//查询列表 //查询全部,分页 //pageable:分页参数

qq_43663493的博客 572

计算机图形学入门30:动画与模拟介绍

计算机图形学入门,动画与模拟,物理模拟,质点弹簧系统,运动学,粒子系统,动作捕捉。

YanisWu的博客 1485

Spring Data JPA之JpaSpecificationExecutor复杂动态查询实例

本文接SpringDataJPA查询方法那些事继续学习JpaSpecificationExecutor复杂动态查询。 【1】回顾简单查询 简单动态查询实例如下: public Page&amp;amp;amp;amp;amp;amp;amp;lt;User&amp;amp;amp;amp;amp;amp;amp;gt; test(){ Sort sort = new Sort(Sort.Direction.DESC,&amp;amp;amp;amp;amp;amp;

小小默:进无止境 2万+

Seurat3.0小提琴图腰围的参数

小提琴图没有有些群没有出现小提琴只有点点,是由于0值比例太多, 一个关键的参数scale = "width"导致了这种局面,应加上上述参数 ggplot(p$data,aes(ident,CD4)) + geom_violin(scale = "width", adjust =1, trim = TRUE) + geom_jitter()+ theme_bw() adjust参数可以调整腰的粗细,eg: ggplot(p$data,aes(ident,CD4)) + geom_violin(scale

Demomwu的博客 1661

HFSS实战项目——高带外抑制特性SIW带通滤波器

本文对单级滤波器和双级滤波器的设计、工作原理及仿真结果进行了详细分析,并验证了双级SIW带通滤波器在性能方面的优越性,为微波通信系统中滤波器的设计和应用提供了重要参考。

2401_87464239的博客 1812

JPA之Specification复杂条件查询

在日常工作的过程中,难免会遇到条件查询,接下来就来了解一下Specification条件查询。 要使用Specification条件查询,我们需要继承JpaSpecificationExecutor这个接口。 public interface PetDao extends JpaRepository<Pet,Integer>, JpaSpecificationExecutor<Pet>{} 实体类我们依然使用Pet 测试: 查询所有名字为pp的Pet。由于Spec

qq_43110032的博客 1万+

【nvidia-B200】实际生产报错NVRM: nvAssertFailedNoLog: Assertion failed: pIOVAS != NULL @ io_vaspace.c:601

升级 NVIDIA 驱动到 R545/R550 数据中心版本(解决 IOVA bug,这是性能差的根本原因);重启服务器(清理驱动残留资源,消除日志中的 NVRM 错误);验证 NVLink/PCIe 链路(确保 8 卡互联使用高速链路,而非单卡 PCIe 共享带宽)。完成这 3 步后,ncccl-test的all_reduce带宽应能提升至100GB/s 以上(取决于服务器的 NVLink/NVSwitch 配置),恢复正常性能。

jundao1997的专栏 648

Spring data jpa 复杂动态查询方式总结

一.Spring data jpa 简介 首先我并不推荐使用jpa作为ORM框架,毕竟对于负责查询的时候还是不太灵活,还是建议使用mybatis,自己写sql比较好.但是如果公司用这个就没办法了,可以学习一下,对于简单查询还是非常好用的.     首先JPA是Java持久层API,由Sun公司开发, 希望整合ORM技术,实现天下归一.  诞生的缘由是为了整合第三方ORM框架,建立一种标准的...

ALID 14万+

(建议收藏)2024最新 URL Scheme大全APP跳转界面地址更新中 ios快捷指令快捷方式链接跳转微信小程序必备autojs可用免root (可定制开发和提取URL Scheme 参数提取)

(建议收藏)2024最新 URL Scheme大全APP跳转界面地址更新中 ios快捷指令快捷方式链接跳转微信小程序必备autojs可用免root (可定制开发和提取URL Scheme 参数提取)

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1万+

YOLOv11改进策略【小目标改进】| 添加专用于小目标的检测层 附YOLOv1~YOLOv11的检测头变化详解

在目标检测领域,小目标检测一直是一个具有挑战性的问题。算法以其高效快速的特点受到广泛关注,然而在面对小目标时,仍存在一些局限性。本文将介绍如何在中添加小目标检测层,以提高对小目标的检测能力。原始模型结构如下:详细内容参考:YOLOv11原始模型结构介绍 二、有效特征层对应的检测头类别 2.1 P3/8 - small检测头 原始模型中的对应的检测头主要用于检测相对较小的目标。其特征图大小相对较大,空间分辨率较高。 适合检测尺寸大概在到像素左右的目标。 2.2 P4/16 - medium检测头 这个检

Limiiiing的博客 8796

spring data jpa 利用JpaSpecificationExecutor做复杂查询

spring data jpa 通过创建方法名来做查询,只能做简单的查询,那如果我们要做复杂一些的查询呢,多条件分页怎么办,这里,spring data jpa为我们提供了JpaSpecificationExecutor接口,只要简单实现toPredicate方法就可以实现复杂的查询1.首先让我们的接口继承于JpaSpecificationExecutorpublic interface TaskD

打不死的小强 5万+

零基础教你学RDMA驱动开发--第8篇:队列对(QP)、完成队列(CQ)与工作请求(WR)机制剖析

本文深入剖析了RDMA(远程直接内存访问)中的核心机制:队列对(QP)、完成队列(CQ)和工作请求(WR)。QP作为通信端点包含发送队列(SQ)和接收队列(RQ);WR是用户提交的操作指令,转换为工作队列元素(WQE)后由网卡异步执行;CQ则提供完成通知机制。文章详细介绍了三者的协作原理,包括QP状态机、WR提交方式、CQ轮询机制,以及关键的信号控制技术(Signaled Mode)来优化性能。同时对比了SEND/RECV和RDMA WRITE两种模式的差异,提供了调试技巧和最佳实践。这些机制共同构成了RD

amy_mhd的博客 156

Spring Data JPA详解

Spring Data是持久层通用解决方案,支持关系型数据库 Oracle、MySQL、非关系型数据库NoSQL、Map-Reduce 框架、云基础数据服务 、搜索服务等。

JAVA_KX的博客 3289

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

JPA多条件动态查询

JPA如何根据前台传的多个参数(有的有值,有的没有值),进行like、equals等复杂,动态查询数据 主要使用以下几个类 Specification Predicate CriteriaQuery CriteriaBuilder PagingAndSortingRepository JpaSpecificationExecutor 1.代码 1-1.entity @Data @NoArgsConstructor @AllArgsConstructor @Entity @Table(name = "T_

沐雨云楼 6475

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

关于 Spring Data JPA 实现动态多条件查询

最近抽出来一些时间来整理,最近用到的东西,这次主要是写一下 JPA 的动态实现多条件查询 这里就不贴全部的内容了,只贴出来了,关键代码 首先是 Dao,作为一个负责任的博主,我把引用的包也贴出来了,注意第一个 第二个 必须要有 import org.springframework.data.jpa.repository.JpaRepository; import org.springfra...

平凡的人类的博客 1442

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Spring Data JPA进阶(三):Specification查询

Spring Data JPA支持非常丰富的查询方式,本文主要介绍Specification查询。 JPA 2 规范引进了criteria查询API。Spring Data JPA对此提供了支持。如果你想使用这个功能,只需要继承JpaSpecificationExecutor接口。这个接口已经实现了基本的查询方法(findOne,findAll,count等)。 public interface ...

程铭程铭你快成名的博客 1万+

Spring Data JPA 使用JpaSpecificationExecutor实现多条件查询(分页查询和非分页查询)

文章目录1、Repository层继承`JpaSpecificationExecutor`2、Service层编写方法设置筛选条件Specification3、在Service层调用刚刚编写的方法和Repository层的方法实现查询①非分页查询②分页查询 1、Repository层继承JpaSpecificationExecutor<T> 如下: @Repository public interface UserRepository extends JpaRepository<UserD

yogima的博客 2422

Spring Data JPA 之 JpaSpecificationExecutor 的实现原理

我们可以⾃定义⼀个Specification的实现类,它可以实现任何实体的动态查询和各种条件的组合。}/***实现实体根据不同的字段、不同的Operator组合成不同的Predicate条件*caseGTcaseLTcaseLK}else{}}}我们通过泛型,解决不同实体的动态查询(当然了,我只是举个例⼦,这个⽅法可以进⾏⽆限扩展)。}其中的Operator也是我们⾃定义的。...

曾小二的博客 3987

Spring-Data-Jpa动态查询(Specification)

JPA允许基于Criteria对象进行按条件查询,而SpringDataJpa提供了一个Specification接口,Specification接口封装了JPA的Criteria查询条件,从而可以通过此接口更加方便地使用Criteria查询,Specification接口的源代码如下。 import static org.springframework.data.jpa.domain.Spe...

小马同学 1万+
上一篇: SpringBoot + SpringData JPA + MySQL 的快速开始实例
下一篇: 关于javaWeb中配置文件读取路径(classPath与类加载器的关系/Resource),以及读取Properties文件的方法
ACTIM__
博客等级 码龄9年 35粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值