2016-06-30 3 views
0

私はSpring Batchで作業しており、DBからデータを取得するためにページングを使用しています。最初の試行その期待どおりのクエリが2番目のページのために1つの予期しないパラメータを追加します。なぜか分からない。Springバッチページングの問題

XMLファイル内の私のクエリは、その発火クエリが最初のページのために、このような何かをデータをフェッチし、その

Reading page 0 
SQL used for reading first page: [SELECT * FROM (SELECT application_id, upper(application_status) as application_status,relationship_code, create_date,submission_date,transmission_date,TRANSMISSION_STATUS,tpa_notes,site_details_id,transaction_num,PROCESS_STATUS,process_date,application_status_date,first_name,middle_name,last_name,suffix,prefix,APPROVED_REJECTED_DATE,action_by,ass_acronym,user_name,applicant_name,site_name,ASSOCIATION_ID, (TO_DATE('2016-06-29', 'yyyy-mm-dd') - trunc(create_date)) as elapsedDays FROM VIEW_SUMMARY_APPLICATION WHERE (upper(application_status)='PENDING' OR (upper(application_status) IN ('APPROVED','DECLINED') AND trunc(application_status_date) = TO_DATE('2016-06-29', 'yyyy-mm-dd'))) and TRANSACTION_NUM >= :minId and TRANSACTION_NUM <= :maxId ORDER BY transaction_num ASC) WHERE ROWNUM <= 10] 
Using parameterMap:{minId=100000002630, maxId=100000002663} 

しかし、2ページ目のそのはに1つの以上のパラメータを追加することが予想ため

<bean id="summaryAppReader" scope="step" autowire-candidate="false" 
    class="org.springframework.batch.item.database.JdbcPagingItemReader"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="rowMapper"> 
     <bean class="com.majesco.nyl.batch.mapper.SummaryApplicationRowMapper" /> 
    </property> 
    <property name="queryProvider"> 
     <bean 
      class="org.springframework.batch.item.database.support.SqlPagingQueryProviderFactoryBean"> 
      <property name="dataSource" ref="dataSource" /> 
      <property name="fromClause" value="VIEW_SUMMARY_APPLICATION" /> 
      <property name="selectClause" 
       value="application_id, upper(application_status) as application_status,relationship_code, create_date,submission_date,transmission_date,TRANSMISSION_STATUS,tpa_notes,site_details_id,transaction_num,PROCESS_STATUS,process_date,application_status_date,first_name,middle_name,last_name,suffix,prefix,APPROVED_REJECTED_DATE,action_by,ass_acronym,user_name,applicant_name,site_name,ASSOCIATION_ID, (TO_DATE('#{jobParameters['runDate']}', 'yyyy-mm-dd') - trunc(create_date)) as elapsedDays" /> 
      <property name="sortKeys"> 
       <map> 
        <entry key="transaction_num" value="ASCENDING" /> 
       </map> 
      </property> 
      <property name="whereClause" 
       value="(upper(application_status)='PENDING' OR (upper(application_status) IN ('APPROVED','DECLINED') AND trunc(application_status_date) = TO_DATE('#{jobParameters['runDate']}', 'yyyy-mm-dd'))) and TRANSACTION_NUM &gt;= :minId and TRANSACTION_NUM &lt;= :maxId" /> 
     </bean> 
    </property> 
    <property name="parameterValues"> 
     <map> 
      <entry key="minId" value="#{stepExecutionContext[minValue]}" /> 
      <entry key="maxId" value="#{stepExecutionContext[maxValue]}" /> 
     </map> 
    </property> 
</bean> 

です予想外の_TRANSACTION_NUMクエリ

Reading page 1 
SQL used for reading remaining pages: [SELECT * FROM (SELECT application_id, upper(appication_status) as application_status,relationship_code, create_date,submission_date,transmission_date,TRANSMISSION_STATUS,tpa_notes,site_details_id,transaction_num,PROCESS_STATUS,process_date,application_status_date,first_name,middle_name,last_name,suffix,prefix,APPROVED_REJECTED_DATE,action_by,ass_acronym,user_name,applicant_name,site_name,ASSOCIATION_ID, (TO_DATE('2016-06-29', 'yyyy-mm-dd') - trunc(create_date)) as elapsedDays FROM VIEW_SUMMARY_APPLICATION WHERE (upper(application_status)='PENDING' OR (upper(application_status) IN ('APPROVED','DECLINED') AND trunc(application_status_date) = TO_DATE('2016-06-29', 'yyyy-mm-dd'))) and TRANSACTION_NUM >= :minId and TRANSACTION_NUM <= :maxId ORDER BY transaction_num ASC) WHERE ROWNUM <= 10 AND ((transaction_num > :_transaction_num))] 
Using parameterMap:{minId=100000002596, maxId=100000002629, _transaction_num=100000002622} 

FYI。 TRANSACTION_NUMは一意ではありません。

答えて

0

それはあなたのsortKeysによるものです。

 <property name="sortKeys"> 
      <map> 
       <entry key="transaction_num" value="ASCENDING" /> 
      </map> 
     </property> 

春のバッチは、ページ0から最高transaction_numを使用して、次のページがよりtransaction_num高いを持っている必要があります言っている:あなたは次のように定義しました。

フレームワークは、各ページのバインド変数をインクリメントして、一意の結果が得られるようにします。ここで問題となるのは、正しくページするための主キーが現実的に必要であるということです。pageSize(デフォルト= 10、照会にWHERE ROWNUM <= 10が追加されている場所で表示されます)は、レコードの一部を切り捨てます。

+0

あなたの 'application_id'はユニークですか?もしそうなら、ソートキーとして代わりに使用することをお勧めします。 –

+0

ソートキーを一意の列に変更して、私は嫌です。そしてそれは働いた。ありがとうございました。 – KSHiTiJ