2015-02-18 3 views
0

Что было бы лучшим способом задать пользовательские параметры для запроса JdbcPagingItemReader?Spring Batch 3.0.3: Как настроить пользовательские параметры для запроса JdbcPagingItemReader?

Моего заказ JdbcPagingItemReader реализация:

public class CustomItemReader extends JdbcPagingItemReader<Long> { 
    public CustomItemReader(DataSource dataSource) throws Exception { 
     SqlPagingQueryProviderFactoryBean queryProvider = new SqlPagingQueryProviderFactoryBean(); 
     queryProvider.setDataSource(dataSource); 
     queryProvider.setSelectClause("SELECT t1.id"); 
     queryProvider.setFromClause("FROM table1 t1 LEFT JOIN table2 t2 ON t2.fk_table1_id = t1.id"); 
     queryProvider.setWhereClause("WHERE (t1.col1 = :param1) AND ((t2.id IS NULL) OR (t2.col3 = :param2))"); 
     queryProvider.setSortKey("t1.id"); 

     setDataSource(dataSource); 
     setFetchSize(10); 
     setRowMapper(new RowMapper<Long>() { 
      @Override 
      public Long mapRow(ResultSet rs, int rowNum) throws SQLException { 
       return rs.getLong(1); 
      } 
     }); 
     setQueryProvider(queryProvider.getObject()); 
    } 
} 
+1

Почему вы расширяете 'JdbcPaging ItemReader' в первую очередь? –

+0

Я хотел попробовать переопределить параметры обновления, но я не нашел способ сделать это. Я хотел бы иметь возможность устанавливать разные значения параметров для каждого шага. – Ivan

+0

Как вы планируете проходить мимо? –

ответ

2

Чтобы передать параметры из Иова ExecutionContext к JdbcPagingItemReader, вы бы настроить писатель следующим образом:

<bean id="itemReader" class="org.springframework.batch.item.database.JdbcPagingItemReader" scope="step"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="rowMapper"> 
     <bean class="MyRowMapper" /> 
    </property> 
    <property name="queryProvider"> 
     <bean class="org.springframework.batch.item.database.support.SqlPagingQueryProviderFactoryBean"> 
      <property name="dataSource" ref="dataSource" /> 
      <property name="sortKeys"> 
       <map> 
        <entry key="t1.id" value="ASCENDING"/> 
       </map> 
      </property> 
      <property name="selectClause" value="SELECT t1.id" /> 
      <property name="fromClause" value="FROM table1 t1 LEFT JOIN table2 t2 ON t2.fk_table1_id = t1.id" /> 
      <property name="whereClause" value=""WHERE (t1.col1 = :param1) AND ((t2.id IS NULL) OR (t2.col3 = :param2))" /> 
     </bean> 
    </property> 
    <property name="pageSize" value="10" /> 
    <property name="parameterValues"> 
     <map> 
      <entry key="param1" value="#{jobExecutionContext[param1]}" /> 
      <entry key="param2" value="#{jobExecutionContext[param2]}" /> 
     </map> 
    </property> 
</bean> 

Вы можете просмотреть конфигурацию, как это в действии в примерах весенней партии: https://github.com/spring-projects/spring-batch/tree/master/spring-batch-samples

+0

Я хотел бы знать, как передать args из stepExecutionContext в JdbcPagingItemReader как предложение IN. – Jay

Смежные вопросы