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);}
}

关键代码说明:

  1. JpaNamedQueryProvider

    • 通过实体类上的@NamedQuery定义查询名称和JPQL语句
    • 配置时直接传入命名查询名称
    • 优势:符合JPA规范,编译时检查查询语法
  2. JpaNativeQueryProvider

    • 处理原生SQL查询,需手动指定:
      • SQL语句(注意表名与数据库实际表名一致)
      • 目标实体类型
      • 列名与实体属性的映射关系
    • 适用场景:需要复杂SQL优化或使用数据库特定语法
  3. JpaPagingItemReader

    • 核心分页读取器,自动处理分页逻辑:
      • 使用entityManagerFactory连接数据库
      • 通过pageSize控制每批数据量
      • 支持事务管理(由Spring Batch自动处理)
  4. JpaPagingItemReaderBuilder

    • 通过链式调用简化配置:

      new JpaPagingItemReaderBuilder<>().name("readerName") .entityManagerFactory(...) .pageSize(50) .queryProvider(...) .build();
      
    • 必须配置:entityManagerFactoryqueryProviderpageSize


功能对比表格

类名称功能描述使用场景关键配置参数注意事项
JpaNamedQueryProvider基于实体类的命名查询管理需要复用JPQL查询查询名称(String)需与实体类的@NamedQuery一致
JpaNativeQueryProvider管理原生SQL查询,支持列名到实体属性的映射需要执行原生SQL查询SQL语句、实体类型、属性列名映射数组需确保列名与实体属性严格对应
JpaPagingItemReader分页读取数据的核心组件,支持数据库连接和分页逻辑所有需要分页读取数据的场景entityManagerFactory、pageSize、查询提供者需配合Spring Batch事务管理
JpaPagingItemReaderBuilder构建JpaPagingItemReader的辅助类,提供链式配置方式需要简化配置流程name、entityManagerFactory、pageSize、查询提供者所有参数必须显式配置

使用要点总结:

  1. 命名查询:需在实体类上通过@NamedQuery定义,保证查询名称一致性
  2. 原生查询
    • 表名需与数据库实际表名一致(区分大小写)
    • 列名必须与实体属性严格对应(如:id对应Employee.id
  3. 分页性能
    • pageSize需根据数据库性能调整,建议50-1000之间
    • 分页使用OFFSET时需注意数据库性能(如MySQL InnoDB的优化)
  4. 事务管理:Spring Batch会自动管理事务,但需确保EntityManagerFactory配置正确
  5. 数据映射:原生查询需手动指定列名映射,命名查询自动通过实体属性映射

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/41259.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学有所记——初探向量数据库Weaviate

目标&#xff1a; 了解向量数据库的连接、建库、插入数据、查询数据等基本用法以及关于语义相似度的一些基本概念。 背景&#xff1a; 前段时间尝试在自己的电脑上搭建OllamaDify平台&#xff0c;体验并探索大模型的强大功能。在使用过程中&#xff0c;尤其是在搭建RAG知识库…

uv包简单使用案例

uv由Charlie Marsh开发&#xff0c;是Astral Tool的一个快速Python包安装器和解析器。它类似于pip和pip-tools&#xff0c;但速度更快。此外&#xff0c;uv还支持虚拟环境管理&#xff0c;替代venv和virtualenv。 参考&#xff1a;https://github.com/astral-sh/uv 安装&#x…

34.[前端开发-JavaScript基础]Day11-王者轮播图-书籍购物车-BOM对象-JSON

1 认识BOM操作 认识BOM 2 全局对象window window对象 window对象的作用 window常见的属性 window常见的方法 3 事件对象event window常见的事件 4 location、history location对象常见的属性 Location对象常见的方法 URLSearchParams history对象常见属性和方法 5 navigato…

工作流引擎Flowable介绍及SpringBoot整合使用实例

Flowable简介 Flowable 是一个轻量级的业务流程管理&#xff08;BPM&#xff09;和工作流引擎&#xff0c;基于 Activiti 项目发展而来&#xff0c;专注于提供高性能、可扩展的工作流解决方案。它主要用于企业级应用中的流程自动化、任务管理和审批流等场景。 Flowable 的核心…

Python----计算机视觉处理(Opencv:图像边缘检测:非极大值抑制,双阈值筛选)

一、 高斯滤波 边缘检测本身属于锐化操作&#xff0c;对噪点比较敏感&#xff0c;所以需要进行平滑处理。这里使用的是一个5*5的高斯 核对图像进行消除噪声。 二、计算图像的梯度和方向 三、非极大值抑制 在得到每个边缘的方向之后&#xff0c;其实把它们连起来边缘检测就算完了…

用Deepseek写扫雷uniapp小游戏

扫雷作为Windows系统自带的经典小游戏&#xff0c;承载了许多人的童年回忆。本文将详细介绍如何使用Uniapp框架从零开始实现一个完整的扫雷游戏&#xff0c;包含核心算法、交互设计和状态管理。无论你是Uniapp初学者还是有一定经验的开发者&#xff0c;都能从本文中获得启发。 …

JS数组方法

数组方法 一、数组 JavaScript 数组的大小是可调整的&#xff0c;并且可以包含不同 数据类型。&#xff08;当不需要这些特性时&#xff0c;请使用 类型数组。&#xff09; 注&#xff1a;JavaScript 类型数组是类似数组的对象&#xff0c;它提供了一种在内存缓冲区中读取和写…

string 的接口

我们继续来讲解一些常用的string接口。 一.at接口 我们来看一个越界的问题。 我们运行之后发现这是一个断言错误&#xff0c;直接就终止我们的程序了&#xff0c;不能作为异常被捕捉到&#xff0c;但是我们如果不想让程序直接崩溃该怎么办呢&#xff1f; 此时我们就要用到at关键…

2000-2019年各省地方财政行政事业性收费收入数据

2000-2019年各省地方财政行政事业性收费收入数据 1、时间&#xff1a;2000-2019年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;行政区划代码、地区、年份、地方财政行政事业性收费收入 4、范围&#xff1a;31省 5、指标说明&#xff1a;地方财政行政事业…

Pytorch学习笔记(九)Learning PyTorch - Deep Learning with PyTorch: A 60 Minute Blitz

这篇博客瞄准的是 pytorch 官方教程中 Learning PyTorch 章节的 Deep Learning with PyTorch: A 60 Minute Blitz 部分&#xff0c; 官网链接&#xff1a;https://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html 完整网盘链接: https://pan.baidu.com/s/1L9…

Elasticsearch 的搜索功能

Elasticsearch 的搜索功能 建议阅读顺序&#xff1a; Elasticsearch 入门Elasticsearch 搜索&#xff08;本文&#xff09; 1. 介绍 使用 Elasticsearch 最终目的是为了实现搜索功能&#xff0c;现在先将文档添加到索引中&#xff0c;接下来完成搜索的方法。 查询的分类&…

比特币等虚拟货币实时价格使用说明,数字货币价格获取,k线获取,实时价格获取

数据截图 k线数据 websocket 实时价格数据 根据这些数据可以做出自己的产品 获取时间段内的k线数据 在开始之前&#xff0c;你需要知道的知识&#xff1a; 币种缩写英文名币种IDBTCBitcoinbitcoinETHEthereumethereumEOSEOSeosUSDTTethertetherLTCLitecoinlitecoinUSDDol…

初阶7 vector

本章重点 vector的介绍vector的使用vector的模拟实现 1.vector的介绍 vector就类似数据结构中的顺序表 vector是表示可变大小数组的序列容器。 就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。 意味着可以采用下标对vector的元素 进行访问&#xff0c;和数…

解码未来:DeepSeek开源FlashMLA,推理加速核心技术,引领AI变革

前言&#xff1a; DeepSeek 兑现了自己的诺言&#xff0c;开源了一款用于 Hopper GPU 的高效型 MLA 解码核&#xff1a;FlashMLA。 项目地址&#xff1a;https://github.com/deepseek-ai/FlashMLA 1:FlashMLA 是什么呀&#xff1f; MLA是DeepSeek大模型的重要技术创新点&…

scss预处理器对比css的优点以及基本的使用

本文主要在vue中演示&#xff0c;scss的基本使用。安装命令 npm install sass sass-loader --save-dev 变量 SCSS 支持变量&#xff0c;可将常用的值&#xff08;如颜色、字体大小、间距等&#xff09;定义为变量&#xff0c;方便重复使用和统一修改。 <template><…

GPU架构与通信互联技术介绍

文章目录 GPU架构介绍SM 和 Warp Scheduler GPU通信互联技术介绍1、GPUDirectGPUDirect Shared AccessGPUDirect P2PGPUDirect for VideoGPUDirect for RDMARDMAGPUDirect RDMA GPUDirect Storage 2、NVLink & NVSwitchNVLinkNVSwitch 3、应用场景总结 GPU架构介绍 SM 和 …

强化学习与神经网络结合(以 DQN 展开)

目录 基于 PyTorch 实现简单 DQN double DQN dueling DQN Noisy DQN&#xff1a;通过噪声层实现探索&#xff0c;替代 ε- 贪心策略 Rainbow_DQN如何计算连续型的Actions 强化学习中&#xff0c;智能体&#xff08;Agent&#xff09;通过与环境交互学习最优策略。当状态空间或动…

day 16

创建链接文件 软链接&#xff1a;又叫符号链接&#xff0c;类似win的快捷方式&#xff0c;是一种用来建立文件的特殊文件&#xff0c;这个文件里的数据都是建立链接的文件&#xff0c;但是它和建立链接的文件不是一个东西&#xff0c;如果建立链接的文件移动或删除&#xff0c…

fork系统调用

基本概念&#xff1a; 在操作系统里&#xff0c;进程是正在运行的程序的实例。fork() 函数的作用是复制当前进程&#xff0c;生成一个新的进程&#xff0c;这个新进程被称作子进程&#xff0c;而原本的进程则是父进程。这两个进程&#xff08;父进程和子进程&#xff09;会从 …

【leetcode刷题记录】(java)数组 链表 哈希表

文章目录 四、题目之&#xff1a;代码随想录(1) 代码随想录&#xff1a;数组[704. 二分查找](https://leetcode.cn/problems/binary-search/)[27. 移除元素](https://leetcode.cn/problems/remove-element/)暴力解:双指针&#xff1a; [977. 有序数组的平方](https://leetcode.…