Spring 批次中的 JdbcPagingItemReader 没有给出正确的结果
JdbcPagingItemReader in Spring batch is not giving correct results
我遇到的问题是 query 和 pagination 配置记录 return 我给出的记录数不正确。分页配置不正确。
分页 return 减去记录数。
分页配置的查询等价物
select *
from SOME_TABLE
where CLIENT_FILE_NM= 'process_abc.20150617024850' AND TXN_ID IS NOT NULL AND SOME_DATA IS NOT NULL order by CREATE_DT ASC;
分页配置
<bean id="postItemReader"
class="org.springframework.batch.item.database.JdbcPagingItemReader"
scope="step">
<property name="dataSource" ref="dataSource" />
<property name="queryProvider">
<bean
class="org.springframework.batch.item.database.support.SqlPagingQueryProviderFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="selectClause" value="select *" />
<property name="fromClause" value="from SOME_TABLE" />
<property name="whereClause"
value="CLIENT_FILE_NM= :fileName AND TXN_ID IS NOT NULL AND SOME_DATA IS NOT NULL" />
<property name="sortKey" value="CREATE_DT" />
<!-- CARD_SETTL_STG_ID_PK ASC -->
</bean>
</property>
<property name="parameterValues">
<map>
<entry key="fileName" value="#
{jobParameters['fileName']}" />
</map>
</property>
<property name="pageSize" value="10" />
<property name="rowMapper">
<bean class="com.wdpr.payment.batch.mapper.OutputVOMapper" />
</property>
<property name="saveState" value="false"/>
</bean>
检查数据库中的数据。我认为问题与 IS NOT NULL 比较有关,这取决于您的数据库引擎和 table 定义 NULL 可以用不同的方式解释。尝试比较 TXN_ID != '',或 > 0,具体取决于您的数据类型。
问题已解决,因为 sortKey 必须是唯一键。 Spring 按以下格式创建查询:
SELECT * FROM (SELECT * FROM CRD_SETTL WHERE CLIENT_FILE_NM= :fileName AND TXN_ID IS NOT NULL AND SETTL_DATA IS NOT NULL ORDER BY CREATE_DT ASC) WHERE ROWNUM <= 10 AND ((CREATE_DT > :_CREATE_DT))
记录会丢失。
<property name="sortKey" value="CREATE_DT" />
// 这不是唯一的...
我遇到的问题是 query 和 pagination 配置记录 return 我给出的记录数不正确。分页配置不正确。 分页 return 减去记录数。
分页配置的查询等价物
select *
from SOME_TABLE
where CLIENT_FILE_NM= 'process_abc.20150617024850' AND TXN_ID IS NOT NULL AND SOME_DATA IS NOT NULL order by CREATE_DT ASC;
分页配置
<bean id="postItemReader"
class="org.springframework.batch.item.database.JdbcPagingItemReader"
scope="step">
<property name="dataSource" ref="dataSource" />
<property name="queryProvider">
<bean
class="org.springframework.batch.item.database.support.SqlPagingQueryProviderFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="selectClause" value="select *" />
<property name="fromClause" value="from SOME_TABLE" />
<property name="whereClause"
value="CLIENT_FILE_NM= :fileName AND TXN_ID IS NOT NULL AND SOME_DATA IS NOT NULL" />
<property name="sortKey" value="CREATE_DT" />
<!-- CARD_SETTL_STG_ID_PK ASC -->
</bean>
</property>
<property name="parameterValues">
<map>
<entry key="fileName" value="#
{jobParameters['fileName']}" />
</map>
</property>
<property name="pageSize" value="10" />
<property name="rowMapper">
<bean class="com.wdpr.payment.batch.mapper.OutputVOMapper" />
</property>
<property name="saveState" value="false"/>
</bean>
检查数据库中的数据。我认为问题与 IS NOT NULL 比较有关,这取决于您的数据库引擎和 table 定义 NULL 可以用不同的方式解释。尝试比较 TXN_ID != '',或 > 0,具体取决于您的数据类型。
问题已解决,因为 sortKey 必须是唯一键。 Spring 按以下格式创建查询:
SELECT * FROM (SELECT * FROM CRD_SETTL WHERE CLIENT_FILE_NM= :fileName AND TXN_ID IS NOT NULL AND SETTL_DATA IS NOT NULL ORDER BY CREATE_DT ASC) WHERE ROWNUM <= 10 AND ((CREATE_DT > :_CREATE_DT))
记录会丢失。
<property name="sortKey" value="CREATE_DT" />
// 这不是唯一的...