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

在JdbcCursorItemReader中使用作业参数作为准备好的语句参数

酆意智
2023-03-14

我有一个作业必须使用不同的作业参数运行多次。我想设置一个JdbcCursorItemReader来执行对作业的查询,itemReader配置如下:

<bean id="tpsItemReader" 
    class="org.springframework.batch.item.database.JdbcCursorItemReader">
    <property name="dataSource" ref="myDataSource"/>
    <property name="sql" value="#{sqlQueries['tps.findStuffforSomeSubset']}"/>
    <property name="preparedStatementSetter">
        <bean class="com.initech.reports.tps.ParameterSetter">
            <!-- can't hardcode this, I want a job parameter here -->
            <constructor-arg value="A"/> 
        </bean>
    </property>
    <property name="rowMapper">
        <bean class="com.initech.reports.tps.CustomerRowMapper"/>
    </property>
</bean>

作业配置如下:

<batch:job id="tpsReportJob">
    <batch:step id="tpsReportJob.generateReport">
        <batch:tasklet>
            <batch:chunk reader="tpsItemReader" 
            processor="tpsItemProcessor" 
            writer="tpsItemWriter" commit-interval="100000"/>
        </batch:tasklet>
    </batch:step>
</batch:job>
package com.initech.reports.tps;

import java.sql.PreparedStatement;
import java.sql.SQLException;

import org.springframework.jdbc.core.PreparedStatementSetter;

public class ParameterSetter implements PreparedStatementSetter {

    private final String x;

    public ParameterSetter(String x) {this.x = x;}

    @Override
    public void setValues(PreparedStatement ps) throws SQLException {
        ps.setString(1, x);
    }
}
        <bean class="com.initech.reports.tps.ParameterSetter">
            <constructor-arg value="#{jobParameters['myParam']}"/>
        </bean>

但我得到了这个错误:

Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0): Field or property 'jobParameters' cannot be found on object of type 'org.springframework.beans.factory.config.BeanExpressionContext'
    at org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:208)
    at org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:72)
    at org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:52)
    at org.springframework.expression.spel.ast.SpelNodeImpl.getValue(SpelNodeImpl.java:93)
    at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:88)
    at org.springframework.context.expression.StandardBeanExpressionResolver.evaluate(StandardBeanExpressionResolver.java:139)
    ... 51 more

我发现了一个非常相似的问题,这个问题和这个问题的区别是,我没有reader类来注释,我只有xml条目,因为我希望避免创建自己的ItemReader。(我可以尝试重写jdbcCursorItemReader类,以便能够对其进行注释...)

共有1个答案

林昱
2023-03-14

它只需将scope属性添加到parameterSetter类中:

    <bean class="com.initech.reports.tps.ParameterSetter"
        scope="step">
        <constructor-arg value="#{jobParameters['myParam']}"/>
    </bean>
 类似资料:
  • 问题内容: 我正在自定义由hibernate生成的插入SQL,并遇到了问题。当Hibernate自己生成查询时,它将数据插入表的前两列,但这会导致数据库错误,因为表的所有四列都是不可为空的。为了正确执行插入,它必须将相同的数据插入到新记录的两列中。这意味着我需要Hibernate将相同的数据绑定到我正在编写的查询(准备好的语句)中的两个不同的参数上。 是否有一些SQL语法可让我以与绑定到绑定语句不

  • 问题内容: 这可能吗?例如 如果没有,我应该这样做吗: 还是我需要学习其他技巧? 问题答案: 表名和列名不能用PDO中的参数替换。请参见PHP PDO语句可以接受表名或列名作为参数吗?

  • 问题内容: 我已经看过,但无法找到我遇到的以下挑战的答案。似乎很简单,但我一直无法解决。 我有一个类型为的记录ID 。我想使用此记录ID列表从另一个表中选择行。到目前为止,一切都很好。现在面对挑战… a)我正在使用一条准备好的语句从表中选择数据,并以此作为输入。 上面的问题-应该如何定义参数?上面对于类型参数似乎不正确。 b)在为准备好的语句设置参数值时,我也遇到了问题。没有设置类型值的方法,我看

  • 问题内容: 我正在编写一些SQL,并使用AdoDb连接到我的数据库并运行查询等等。我正在使用参数化查询,并且遇到了麻烦。 它们是将值的数组传递给AdoDb / MySql中的in_clause进行参数化的一种方法。 我的问题是,如果我将准备好的字符串作为参数传递,即 ‘test’,’test2’,’test3’, 则它不起作用,因为库或数据库会自动对其进行转义并在开头和结尾处添加外部引号,因此所有

  • 我准备了以下语句,通过JDBC驱动程序将其发送到Oracle数据库: 但是,我希望使用相同的准备好的语句,通过提供通配符参数这样的东西来获取表中的所有行。我尝试了“*”和“”这样的字符串,但它总是不返回行。 是否存在用于获取所有行的此准备语句中的参数的值?

  • 我在prepare语句和bind_param中有正确的数字(7),所以我不知道为什么会发生这种情况。