spring batch 中JpaNamedQueryProvider、JpaNativeQueryProvider两种查询方式对比
完整代码示例:对比两种查询方式
// Employee.java 实体类(包含命名查询)
@Entity
@NamedQuery(name = "Employee.findAllNamedQuery", query = "SELECT e FROM Employee e ORDER BY e.id") // 定义命名查询
public class Employee {@Idprivate Long id;private String name;private Double salary;// getters/setters
}// JobConfig.java 配置类
@Configuration
@EnableBatchProcessing
public class JobConfig {@Autowiredprivate JobBuilderFactory jobBuilderFactory;@Autowiredprivate StepBuilderFactory stepBuilderFactory;@Autowiredprivate EntityManagerFactory entityManagerFactory;@Beanpublic Job employeeJob() {return jobBuilderFactory.get("employeeJob").start(employeeStep1()) // 使用命名查询的步骤.next(employeeStep2()) // 使用原生查询的步骤.build();}// 使用JpaNamedQueryProvider的步骤@Beanpublic Step employeeStep1(JpaPagingItemReader<Employee> namedQueryReader) {return stepBuilderFactory.get("step1").<Employee, Employee>chunk(10).reader(namedQueryReader).writer(items -> items.forEach(System.out::println)).build();}// 使用JpaNativeQueryProvider的步骤@Beanpublic Step employeeStep2(JpaPagingItemReader<Employee> nativeQueryReader) {return stepBuilderFactory.get("step2").<Employee, Employee>chunk(10).reader(nativeQueryReader).writer(items -> items.forEach(System.out::println)).build();}// 命名查询配置@Beanpublic JpaPagingItemReader<Employee> namedQueryReader() {return new JpaPagingItemReaderBuilder<Employee>().name("namedQueryReader").entityManagerFactory(entityManagerFactory).pageSize(50).queryProvider(new JpaNamedQueryProvider("Employee.findAllNamedQuery")).build();}// 原生查询配置@Beanpublic JpaPagingItemReader<Employee> nativeQueryReader() {return new JpaPagingItemReaderBuilder<Employee>().name("nativeQueryReader").entityManagerFactory(entityManagerFactory).pageSize(50).queryProvider(new JpaNativeQueryProvider<>("SELECT e.id, e.name, e.salary FROM EMPLOYEE e ORDER BY e.id", // 原生SQLEmployee.class, // 映射实体new String[]{"id", "name", "salary"} // 列名到属性的映射)).build();}
}// SpringBatchApplication.java 启动类
@SpringBootApplication
@EnableBatchProcessing
public class SpringBatchApplication {public static void main(String[] args) {SpringApplication.run(SpringBatchApplication.class, args);}
}
关键代码说明:
-
JpaNamedQueryProvider
- 通过实体类上的
@NamedQuery定义查询名称和JPQL语句 - 配置时直接传入命名查询名称
- 优势:符合JPA规范,编译时检查查询语法
- 通过实体类上的
-
JpaNativeQueryProvider
- 处理原生SQL查询,需手动指定:
- SQL语句(注意表名与数据库实际表名一致)
- 目标实体类型
- 列名与实体属性的映射关系
- 适用场景:需要复杂SQL优化或使用数据库特定语法
- 处理原生SQL查询,需手动指定:
-
JpaPagingItemReader
- 核心分页读取器,自动处理分页逻辑:
- 使用
entityManagerFactory连接数据库 - 通过
pageSize控制每批数据量 - 支持事务管理(由Spring Batch自动处理)
- 使用
- 核心分页读取器,自动处理分页逻辑:
-
JpaPagingItemReaderBuilder
-
通过链式调用简化配置:
new JpaPagingItemReaderBuilder<>().name("readerName") .entityManagerFactory(...) .pageSize(50) .queryProvider(...) .build(); -
必须配置:
entityManagerFactory、queryProvider、pageSize
-
功能对比表格
| 类名称 | 功能描述 | 使用场景 | 关键配置参数 | 注意事项 |
|---|---|---|---|---|
| JpaNamedQueryProvider | 基于实体类的命名查询管理 | 需要复用JPQL查询 | 查询名称(String) | 需与实体类的@NamedQuery一致 |
| JpaNativeQueryProvider | 管理原生SQL查询,支持列名到实体属性的映射 | 需要执行原生SQL查询 | SQL语句、实体类型、属性列名映射数组 | 需确保列名与实体属性严格对应 |
| JpaPagingItemReader | 分页读取数据的核心组件,支持数据库连接和分页逻辑 | 所有需要分页读取数据的场景 | entityManagerFactory、pageSize、查询提供者 | 需配合Spring Batch事务管理 |
| JpaPagingItemReaderBuilder | 构建JpaPagingItemReader的辅助类,提供链式配置方式 | 需要简化配置流程 | name、entityManagerFactory、pageSize、查询提供者 | 所有参数必须显式配置 |
使用要点总结:
- 命名查询:需在实体类上通过
@NamedQuery定义,保证查询名称一致性 - 原生查询:
- 表名需与数据库实际表名一致(区分大小写)
- 列名必须与实体属性严格对应(如:
id对应Employee.id)
- 分页性能:
pageSize需根据数据库性能调整,建议50-1000之间- 分页使用
OFFSET时需注意数据库性能(如MySQL InnoDB的优化)
- 事务管理:Spring Batch会自动管理事务,但需确保
EntityManagerFactory配置正确 - 数据映射:原生查询需手动指定列名映射,命名查询自动通过实体属性映射
相关文章:
spring batch 中JpaNamedQueryProvider、JpaNativeQueryProvider两种查询方式对比
完整代码示例:对比两种查询方式 // Employee.java 实体类(包含命名查询) Entity NamedQuery(name "Employee.findAllNamedQuery", query "SELECT e FROM Employee e ORDER BY e.id") // 定义命名查询 public class Em…...
Spring项目中使用EasyExcel实现Excel 多 Sheet 导入导出功能(完整版)
Excel 多 Sheet 导入导出功能完整实现指南 一、环境依赖 1. Maven 依赖 <!-- EasyExcel --> <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.2</version> </dependency>…...
OkHttp的拦截器是如何工作的?
OkHttp 的拦截器是其核心特性之一,它允许开发者在请求和响应的处理过程中插入自定义逻辑。下面为你详细介绍 OkHttp 拦截器的工作原理、分类及执行流程。 拦截器工作原理概述 OkHttp 中的拦截器本质上是实现了Interceptor接口的类。该接口定义了一个intercept方法,在这个方…...
CentOS 7 安装 EMQX (MQTT)
CentOS 7 安装 EMQX 通过 Yum 源安装 EMQX 支持通过 Yum 源安装,您可通过以下 Yum 命令从中自动下载和安装 EMQX。 通过以下命令配置 EMQX Yum 源: curl -s https://assets.emqx.com/scripts/install-emqx-rpm.sh | sudo bash安装以下依赖项ÿ…...
重试机制之指针退避策略算法
一、目的:随着重试次数增加,逐步延长重连等待时间,避免加重服务器负担。 二、计算公式: 每次重试的延迟时间 初始间隔 (退避基数 ^ 重试次数) 通常设置上限防止等待时间过长。 const delay Math.min(initialDelay * Math.pow…...
spring security的过滤器链
Spring Security 的安全功能通过一系列过滤器(Filter)组成的链式结构实现,每个过滤器负责处理特定的安全任务。这些过滤器按特定顺序执行,形成过滤器链(Security Filter Chain)。以下是其核心过滤器及工作原…...
人工智能:officeAI软件,如何调整AI对话界面的字体?
1、首先,随便打开一个excel(使用wps) 依次点击上方的【OfficeAI】—【右侧面板】 2、在弹出的面板中,输入:助手设置 , 然后按【回车】发送出去 3、之后会弹出界面,在【样式设定】中ÿ…...
Qt之共享内存类QSharedMemory的使用及实现原理(全)
目录 1.简介 2.使用 3.实现原理 3.1.Windows内存映射 3.2.POSIX 共享内存 3.3.System V 共享内存 3.4.QSharedMemory的实现原理 4.总结 1.简介 QSharedMemory 是 Qt 框架提供的一个类,用于在不同进程或线程之间实现共享内存的管理。借助共享内存,…...
dockerfile构建镜像方式
在 Docker 中,可使用 docker build 命令依据 Dockerfile 构建镜像。下面为你详细介绍构建镜像的具体方式。 基本构建命令 若要构建镜像,需在包含 Dockerfile 的目录下执行 docker build 命令。基本语法如下: bash docker build -t <镜像…...
Problem A: 接口使用
1.题目问题 2.样例 3.代码实现 补充:注意空格 // 定义Vehicle接口 interface Vehicle {void start();void stop(); }// 实现Vehicle接口的Bike类 class Bike implements Vehicle {Overridepublic void start() {System.out.println("i am bike,i am running&…...
用Python插入Excel表格到Word文档
在日常办公场景中,通过Python脚本自动化整合Excel数据与Word文档,能够实现表格的智能迁移,满足不同场景下数据呈现的专业性要求。直接提取表格内容插入Word适用于需要快速传递核心数据的场景,确保信息精准直达;完整复制…...
合合信息TextIn大模型加速器 2.0来了:智能文档解析和图表解析能力全面升级
合合信息“TextIn大模型加速器 2.0”版本来了:文档解析和图表解析能力全面升级 背景 在日常工作中,我们常常遇到无法直接复制的文档内容或图片内容,这些内容通常需要进行识别和解析。一个典型的例子是,当我们需要将折线图转化为…...
笔记:代码随想录算法训练营day62:108.冗余连接、109.冗余连接II
学习资料:代码随想录 108. 冗余连接 卡码网题目链接(ACM模式) 判断是否有环的依据为,利用并查集,isSame函数,判断当下这条边的两个节点入集前是否为同根,如果是的话,该边就是会构…...
刚刚整理实测可用的股票数据API接口集合推荐:同花顺、雅虎API、智兔数服、聚合数据等Python量化分析各项数据全面丰富
在金融科技高速发展的今天,股票API接口已成为开发者、量化交易者和金融从业者的核心工具之一。它通过标准化的数据接口,帮助用户快速获取实时或历史市场数据,为投资决策、策略回测和金融应用开发提供支持。本文将深入解析股票API的核心功能、…...
消息队列Message Queue
前面,我们在黑点点评中秒杀场景中,首次了解到消息队列MQ,它主要解决了秒杀场景中异步场景,提升了并发性,吞吐量。可是还是对消息队列又很多的疑惑? 消息队列是什么 消息队列是一种通信协议或中间件&#…...
Day 25:股票的最大利润 + 1到n求和
数组 prices 记录了某芯片近期的交易价格,其中 prices[i] 表示的 i 天该芯片的价格。你只能选择 某一天 买入芯片,并选择在 未来的某一个不同的日子 卖出该芯片。请设计一个算法计算并返回你从这笔交易中能获取的最大利润。 如果你不能获取任何利润&…...
如何利用AI智能生成PPT提升工作效率
如何利用AI智能生成PPT提升工作效率?PPT制作曾经是每个人办公生活中的一大痛点。你有多久没有在制作PPT时感到焦头烂额,选模板、调整格式、插入图片,每一项都得花费大量的时间和精力,最后还未必能做出一份令人满意的效果。随着人工…...
WIN11 企业版 部署Dify+Docker
Dify(Do it for you)是一款开源的大语言模型应用开发平台,旨在简化AI应用的创建、部署和管理过程,使开发者能够更快速、更轻松地构建和运营基于GPT等模型的AI应用。 Dify平台创建和运营一个AI chatbot应用,涉及到登录…...
理解CMakeLists.txt文件
CMakeLists.txt(主入口) │ ├── 项目元信息(project, cmake_minimum_required) ├── 编译选项设置(option) ├── 编译标志设置(set(CMAKE_...)) ├── 查找依赖库(find_package, include_directories) ├── 注册插件、扩展(register_extension, add_subdi…...
1.25-20GHz/500ns超快跳频!盛铂SWFA300国产捷变频频率综合器模块赋能雷达/5G/电子战高频精密控制 本振/频综模块
盛铂SWFA300捷变频频率综合器模块简述: 盛铂科技国产SWFA300捷变频频率综合器是一款在频率范围内任意两点频率的跳频时间在500nS以内的高速跳频源,其输出频率范围为1.25GHz至20GHz,频率的最小步进为10kHz。同时它拥有优秀的相位噪声特性&…...
MySql修改全部表和字段编码
修改全部表 SELECT CONCAT(ALTER TABLE , TABLE_NAME, CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;) AS sql_statements FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA 数据库名称 返回的下面这种SQL,然后批量执行即可 ALTER TABLE gen_table CO…...
elementUI el-image图片加载失败解决
是不是,在网上找了一些,都不行,这里一行代码,解决,后端返回图片路径,el-image图片加载失败的问题 解决办法, vue项目里,index.html文件里加一行代码就可 <meta name"refe…...
代理IP协议详解HTTP、HTTPS、SOCKS5分别适用于哪些场景
“代理IP协议在现代网络通信中扮演着至关重要的角色。它们通过提供中间层服务,帮助用户匿名访问网络、绕过地理限制、提高安全性和加速数据传输。HTTP、HTTPS和SOCKS5是三种最常见的代理IP协议,每种协议都有其特定的用途和适用场景。” HTTP代理及其适用…...
UniApp开发多端应用——流式语音交互场景优化
一、问题背景:UniApp默认方案的局限性 在流式语音交互场景(如AI语音助手、实时字幕生成)中,UniApp默认的uni.getRecorderManager 和uni.createInnerAudioContext 存在以下瓶颈: 录音端: 延迟高࿱…...
AIGC工具平台-通用抠图换背景
本模块采用先进的大模型智能算法,精准识别并分割图像中的人物或物品主体,实现高效、精准、智能化的抠图处理。无论是人物肖像、产品展示,还是复杂场景,该工具均能准确提取主体,并自动适配至背景图像,实现自…...
word快速创建虚拟文字
创建虚拟文字的作用:如培训新员工使用 Word,用虚拟文字演示如何设置段落格式。不需要你随便乱敲文字或者去复制一段文字过来。帮你节约了时间! 两个函数的使用必须在段落的开头!!! rand函数 在 Word 中…...
win10下python脚本运行缺失ccache的问题处理
问题 python脚本运行时,会提醒参考 https://github.com/ccache/ccache/blob/master/doc/INSTALL.md 处理缺失ccache的问题。 下载编译 下载ccache主干版本, 例如 https://github.com/ccache/ccache/archive/refs/heads/master.zip 按照说明编译 mkd…...
大模型在支气管扩张预测及治疗方案制定中的应用研究
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与方法 1.3 国内外研究现状 二、大模型技术概述 2.1 大模型的基本原理与架构 2.2 适用于支气管扩张预测的大模型类型及特点 2.3 大模型在医疗领域的应用现状与优势 三、支气管扩张的相关医学知识 3.1 支气管扩张的病因…...
开发复合组件TLabel + TwwDBLookupCombo
老鸟跳过。。。。。。。。本文只是为小白准备的 -------------- TwwDBLookupCombo 组件是老牌控件包的 Inofpower 中的一个组件。Inofpower 很久也没有更新了,只是作了新版DELPHI的适配,组件的功能从D2007那些开始到现在,可以说几乎没有任何…...
ch05 课堂参考代码及部分题目思路
ch05 字典树 字典树(Trie)是一种用于实现字符串快速查找的多叉树结构,查找原理类似于我们在英文词典上查找单词。 字典树用边来代表字母,从根结点到树上某一结点的路径就代表了一个字符串。 字典树的表示 以字符集为小写字母的…...
