Spring 批量分页问题
Spring Batch Paging Issue
我正在处理 Spring 批处理,我正在使用分页从数据库中获取数据。这是它第一次按预期触发查询,但对于第二页,它又添加了一个意想不到的参数。我不明白为什么。
我在 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 >= :minId and TRANSACTION_NUM <= :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 不是唯一的。
这是由于您的 sortKeys
。您定义了以下内容:
<property name="sortKeys">
<map>
<entry key="transaction_num" value="ASCENDING" />
</map>
</property>
Spring 批处理正在使用第 0 页中最高的 transaction_num
,并表示下一页的 transaction_num
必须高于该值。
框架将在每个页面递增绑定变量,以确保您始终获得唯一的结果。这里的问题是您实际上需要一个主键才能正确分页,否则您的 pageSize
(默认值 = 10 并看到它在您的查询中添加 WHERE ROWNUM <= 10
的位置)将切断您的一些记录。
我正在处理 Spring 批处理,我正在使用分页从数据库中获取数据。这是它第一次按预期触发查询,但对于第二页,它又添加了一个意想不到的参数。我不明白为什么。
我在 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 >= :minId and TRANSACTION_NUM <= :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 不是唯一的。
这是由于您的 sortKeys
。您定义了以下内容:
<property name="sortKeys">
<map>
<entry key="transaction_num" value="ASCENDING" />
</map>
</property>
Spring 批处理正在使用第 0 页中最高的 transaction_num
,并表示下一页的 transaction_num
必须高于该值。
框架将在每个页面递增绑定变量,以确保您始终获得唯一的结果。这里的问题是您实际上需要一个主键才能正确分页,否则您的 pageSize
(默认值 = 10 并看到它在您的查询中添加 WHERE ROWNUM <= 10
的位置)将切断您的一些记录。