SqlPagingQueryProviderFactoryBean支持In子句

时间:2014-07-28 08:17:42

标签: spring-batch

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

请指导我。

1 个答案:

答案 0 :(得分:0)

由于sql注入安全策略,你不能拥有一个占位符并将其替换为数组,但是sqlPagingQueryProvider属性的gettter / setters selectclause,fromClause和whereCLause是String而不是preparedStatement。 PreparedStatement稍后将在post构造方法期间通过spring批处理构建。因此,您可以将where子句作为String发送给值(Prepared)并将其作为参数传递给job。因此,您的代码会出现这种情况。

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();

您的分页器bean看起来如下所示,并确保将范围设置为步骤

<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>