我想为SqlPagingQueryProviderFactoryBean编写一个SQL。我将传递一个IN子句的参数。当我将它作为参数(?)传递时,我没有得到结果。但是当我对这些值进行硬编码时,我得到了正确的结果。
请指导我。
答案 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>