mysql - 在 Spring Batch ItemReader 中过滤和连接数据库表
问题描述
我熟悉 Spring 中批处理作业的概念,但我只在简单的场景中使用过它,repository
即使用一个管理一个简单实体的场景。此外,在这些场景中,我使用文件作为输入源,使用数据库表作为输出目标。现在我需要对复杂的实体做完全相反的事情。
有什么计划
批处理作业获取LocalDateTime
跨越时间间隔的两个参数。让我们打电话给他们timeParam1
和timeParam2
。
我有两个表TableA和TableB。
TableB
有一列是TableA
被调用的外键ID
TableB
有一列就是一个LocalDateTime
,让我们称之为TIME
现在,在我的批处理作业的第一阶段,我需要执行以下操作:
SELECT * FROM TableA a JOIN TableB b ON a.ID = b.ID
为了合并TableB
属于 的特定记录的所有记录TableA
。- 过滤掉那些
TIME
不在给定时间间隔内的行。 - 返回
TableA
剩余结果集中包含的所有记录。每条记录只应返回一次,因此如果recordA 有多个符合条件的recordB,则不应多次返回recordA。在 java 端,最终结果应作为可用实体对象的列表返回List<A>
然后,处理器会将A
列表中的每个对象转换为 a List<String>
,编写器将负责将这些字符串写入文件,每个都在一行上。
在一个 SQL 查询中,这可能是
SELECT * FROM TableA WHERE nr IN
(SELECT DISTINCT a.nr FROM TableA a JOIN TableB b ON a.ID = b.ID
WHERE timeParam1<= b.TIME AND b.TIME <= timeParam2
nr
只是 TableA 的一个属性。
我试图这样做,Spring Batch API
但未能完成。有人可以就我应该如何处理这个问题提供一些建议吗?
解决方案
推荐阅读
- javascript - 猫鼬错误:“拓扑被破坏”,有什么问题?
- c++ - 目前是否有任何编译器支持 C++20?
- java - 如何针对您的数据库使用 HikariCP BenchMark
- html - 在环绕文本之后放置一个非环绕元素
- python - 用于科学写作的数组的一部分的数学表达式
- c# - EF 6 Core - 多对多关系数据库优先 (EF Core Power Tools/scaffold-dbcontext)
- python - 使用 os.system 从另一个脚本运行脚本
- python - Python 中的 OCR 机器学习 - 使用 keras 训练模型
- ios - 如何构建ffmpeg以获得最小的静态库?我只想将 3gp 转换为 mp4
- c# - 如何在 C# 中调用 Multipart 消息请求