首页 > 解决方案 > 在 Spring Batch ItemReader 中过滤和连接数据库表

问题描述

我熟悉 Spring 中批处理作业的概念,但我只在简单的场景中使用过它,repository即使用一个管理一个简单实体的场景。此外,在这些场景中,我使用文件作为输入源,使用数据库表作为输出目标。现在我需要对复杂的实体做完全相反的事情。

有什么计划

批处理作业获取LocalDateTime跨越时间间隔的两个参数。让我们打电话给他们timeParam1timeParam2

我有两个表TableATableB

现在,在我的批处理作业的第一阶段,我需要执行以下操作:

  1. SELECT * FROM TableA a JOIN TableB b ON a.ID = b.ID为了合并TableB属于 的特定记录的所有记录TableA
  2. 过滤掉那些TIME不在给定时间间隔内的行。
  3. 返回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但未能完成。有人可以就我应该如何处理这个问题提供一些建议吗?

标签: mysqlspringjpaspring-batch

解决方案


推荐阅读