当前位置: 首页 > 知识库问答 >
问题:

使用JdbcCursorItemReader进行动态SQL查询

常俊爽
2023-03-14

我正在为spring批处理使用java配置(spring boot)。我有一个员工Id列表,对于每个Id,我需要运行一个查询(如下所示),然后处理数据。

select * from history where employee_id = ?

我知道我们可以使用阅读器。setPreparedStatementSetter动态设置上述SQL中的参数。但是,我不确定如何对列表中的每个员工id重复批处理过程。即使我将reader()标记为@StepScope,也只会调用一次reader。(即),批次仅运行一次。非常感谢您的帮助。

    List employeeIds = new ArrayList();
    employeeIds.add(1);
    employeeIds.add(2);

    @Bean
    @StepScope
    public ItemReader<History> reader() {
        JdbcCursorItemReader<History> databaseReader = new JdbcCursorItemReader<>();
        databaseReader.setSql("select * from history where employee_id = ?");
        databaseReader.setPreparedStatementSetter(..);
        ....

        return databaseReader;
    }


    @Bean
    public Step step(StepBuilder stepBuilder){
        return stepBuilderFactory.get("sample").
                .reader(reader())
                .processor(processor())
                .writer(writer())
                .build();
    }

共有1个答案

司马耘豪
2023-03-14

所以首先,我不建议你这样做。从理论上讲,而且在实践中几乎总是这样,每次打开一个游标比单独查询要高效得多。

“更好的”方法是将ID列表插入到暂存/驱动表中(通常在前面的步骤中,每当您从原始源获得ID列表时),然后将查询更改为类似以下内容:

select * from history where employee_id in (select id from driving_table)

或者,您至少可以将查询更改为:

select * from history where employee_id in ( ? ) 

并将ID列表传递给它(这里要小心,因为有些数据库限制查询中的参数)。如果您的列表可能超过该限制,则需要打开一个新的光标,有效地对列表分页。

 类似资料:
  • 问题内容: 我有一个关于使用JdbcTemplate进行动态查询的问题。 我的代码如下: 现在,我的问题是,我想要与插入查询中的自动生成问号相同数量的“值”。 现在,值变量考虑为一个字符串,因此,如果我有2个或更多问号,则在值变量中只有一个用逗号分隔的完整字符串,因此它不起作用。 见下面我的查询: 我想要如下: 问题答案: }

  • 问题内容: 我以前从未将golang与mysql一起使用,因此我是 第一次阅读这些内容。我想做这样的事情: 这种输入太多了,尤其是当我想 将更多变量添加到WHERE条件中时。 如果这是PHP,我将执行以下操作: 通过使用foreach循环,我可以动态生成查询并根据需要动态绑定尽可能多的变量。 像golang和mysql这样的选项吗?还是有其他选择不对查询输入每个变量组合? 问题答案: 如果您的地图

  • 问题内容: 我正在使用Jesey在Java(JAX-RS)中实现Restful Web Service。我在Tomcat v7.0上运行它,我使用Hibernate将数据映射到数据库(MySQL)。我有一个查询来获取可交付成果的列表: 它给了我一百个可交付成果,但我想在Task表中拥有前三名。感谢您的帮助。如何修改查询? 请注意,这三个可交付成果不应重复。 与@FGreg答案存在冲突。当我使用这些

  • 问题内容: 我正在尝试使用Mongoose制作动态条件,但是它并没有像我想象的那样起作用。 代码是这样的 如您所见,我正在尝试使用“索引”变量创建动态条件。有可能这样做吗? 先感谢您! 问题答案: 您需要分两步创建对象: 更新资料 现在,node.js 4+支持计算的属性名称,您可以一步完成此操作:

  • 预备:代码存在于使用JPA的JavaWebApp中,并对其感到满意,因此完全脱离JPA并不是解决方案。 但我的部分是关于动态数据查询的。比如说,管理员可以编写sql查询,用户可以通过这些查询生成csv导出。 有了JDBC,我获得了很多关于ResultSet的元数据,我可以在我知道的地方获取字符串和整数。 JPA允许直接SQL查询,但我只能用作为

  • 问题内容: 我曾尝试使用FLINQ,但F#3.0 beta版已经过时了。 有人可以给我一些关于如何在F#中创建动态SQL查询的指示吗? 问题答案: 在F#3.0中,查询会自动加引号,因此您不能使用引号拼接(语法)来构成查询。通过使用拼接来组成查询,您可以编写的大多数内容仍可以通过“常规LINQ方式”来完成,方法是从先前的源创建一个新查询并添加即过滤: 这样,您可以动态添加条件,动态指定投影(使用)