【问题标题】:SqlPagingQueryProviderFactoryBean to support In clauseSqlPagingQueryProviderFactoryBean 支持 In 子句
【发布时间】:2014-07-28 08:17:41
【问题描述】:

我想为 SqlPagingQueryProviderFactoryBean 写一个 SQL。我将传递 IN 子句的参数。当我将它作为参数(?)传递时,我没有得到结果。但是当我对值进行硬编码时,我得到了正确的结果。

请指导我。

【问题讨论】:

  • 举例说明
  • 在我的 sqlPagingQueryProviderBean 的 fromClause 中,我有以下 sql: select u.topic,cu.first_name ,cu.last_name, cu.email from ACTIVE_USER_VIEWS_BY_TOPIC u inner join cl_user cu on u.user_id=cu.id其中 u.topic 在 (?) 和我的 paramaValue 中,我将参数发送为 paramString 的值为 ('topic1','topic2')

标签: spring-batch


【解决方案1】:

由于 sql 注入安全策略,您不能拥有单个占位符并将其替换为数组,但是 sqlPagingQueryProvider 属性 selectclause、fromClause 和 whereCLause 的 gettter/setter 是 String 而不是preparedStatement。 PreparedStatement 稍后将在 post 构造方法期间由 spring 批处理构造。因此,您可以将 where 子句作为带有值(已准备)的字符串发送,并将其作为参数传递给作业。因此,您的代码将属于此类。

String topics = { "topic1", "topic2", "topic3", "topic4"};

StringBuilder str = new StringBuilder("('");

for (String topic : topics) {
    str.append(topic + "','");
}
str.setLength(str.length() - 2);
str.append("')");


final JobParameters jobParameters = new JobParametersBuilder()
                .addLong("time", System.nanoTime())
                .addString("inputsTopics", str.toString())
                .toJobParameters();

并且您的 pagingreader bean 如下所示,并确保您将范围设置为 step

<bean id="sqlPagingReader" class="<your extended prging prvder>.KPPageingProvider" scope="step" >
        <property name="dataSource" ref="dataSource" />
        <property name="selectClause" value="u.topic,cu.first_name ,cu.last_name, cu.email" />
        <property name="fromClause" value="ACTIVE_USER_VIEWS_BY_TOPIC u inner join cl_user cu on u.user_id=cu.id" />
        <property name="whereClause" value="u.topic in #{jobParameters['inputsTopics']}" ></property>
</bean>

【讨论】:

    猜你喜欢
    • 2014-01-14
    • 2012-12-17
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多