2016-06-30 2 views
0

스프링 배치 작업 중이며 DB에서 데이터를 가져 오는 데 페이징을 사용하고 있습니다. 첫 번째 시간 해당 발사 예상대로 쿼리하지만 두 번째 페이지의 예기치 않은 매개 변수가 하나 더 추가되었습니다. 나는 왜 그런지 이해하지 못한다. XML 파일에서스프링 배치 페이징 문제

내 쿼리는 첫 페이지의 발사 쿼리 같은 뭔가를 데이터를 가져 오는에 대한

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

자사의

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} 

그러나 두 번째 페이지에 대한 그것의 또 하나 개의 매개 변수를 추가

예상 예기치 않은 _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} 

참고하시기 바랍니다. 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