Spring批处理:JdbcPagingItemReader无法获取第1页之后的内容

Spring批处理:JdbcPagingItemReader无法获取第1页之后的内容,jdbc,spring-batch,spring-jdbc,mssql-jdbc,Jdbc,Spring Batch,Spring Jdbc,Mssql Jdbc,我的读者: @豆子 公共项目阅读器项目阅读器PagingQueryProvider查询提供者{ 返回新的JdbcPagingItemReaderBuilder .namecreditReader .数据源此数据源 .queryProviderqueryProvider .ROWMAPPERTHS.unitatMapper .pageSize2 建筑 } @豆子 公共SqlPagingQueryProviderFactoryBean查询提供程序{ SqlPagingQueryProviderFac

我的读者:

@豆子 公共项目阅读器项目阅读器PagingQueryProvider查询提供者{ 返回新的JdbcPagingItemReaderBuilder .namecreditReader .数据源此数据源 .queryProviderqueryProvider .ROWMAPPERTHS.unitatMapper .pageSize2 建筑 } @豆子 公共SqlPagingQueryProviderFactoryBean查询提供程序{ SqlPagingQueryProviderFactoryBean提供程序=新的SqlPagingQueryProviderFactoryBean; provider.setDataSourcethis.dataSource; provider.setSelectClauseSELECT im_notext1.nt1_id; provider.setFromClauseFROM im_notext1左外部联接im_notext2 ON im_notext1.nt1_id=im_notext2.nt1_id; provider.setSortKeynt1_id; 退货供应商; } 格式化查询是:

选择 前2个im\u notext1.nt1\u id 从…起 我不知道 im\u notext1.nt1\u id=im\u notext2.nt1\u id上的左外部联接im\u notext2 订购人 nt1\U id ASC 我知道,这似乎是一个愚蠢的问题。只是为了简化上下文

很快,PagingQueryProvider将参与生成分页查询,如:

第0页:

选择 前2个im\u notext1.nt1\u id 从…起 我不知道 im\u notext1.nt1\u id=im\u notext2.nt1\u id上的左外部联接im\u notext2 订购人 nt1\U id ASC 第1页:

选择 前2个im\u notext1.nt1\u id 从…起 我不知道 im\u notext1.nt1\u id=im\u notext2.nt1\u id上的左外部联接im\u notext2 哪里 nt1\U id>? 订购人 nt1\U id ASC 我已激活日志:

logging.level.org.springframework.batch.item.database=debug
我收到以下错误消息:

com.microsoft.sqlserver.jdbc.SQLServerException:不明确的列名“nt1\u id”

实际上,nt1\U id列位于连接from子句的im\U notext1和im\U notext2表上

日志:


有什么想法吗?

您需要在where子句中使用实际的列名im\u notext1.nt1\u id。不能使用在where中的select子句中定义的别名,因为从逻辑上讲,where子句在select子句之前求值,因此从where的角度来看别名“不存在”。但是,由于生成的查询与您的代码不匹配,我猜SpringJDBC中可能有一些额外的功能。我没有时间调查这件事,所以我删除了我先前的答案,并发表了这篇评论。@MarkRotterveel我已经编辑了这篇文章。你能看一下吗?我认为问题在另一方面。我想解决办法是将查询嵌套在from中的表表达式中,即select*from,这样您就有了明确的列名。我不经常使用SpringJDBC,所以如果不投入我现在没有的大量时间,我真的无法帮上忙。这与我的工作有关系吗?
Reading page 0
SQL used for reading first page: [SELECT TOP 2 im_notext1.nt1_id FROM im_notext1 LEFT OUTER JOIN im_notext2 ON im_notext1.nt1_id = im_notext2.nt1_id ORDER BY nt1_id ASC]
Reading page 1
SQL used for reading remaining pages: [SELECT TOP 2 im_notext1.nt1_id FROM im_notext1 LEFT OUTER JOIN im_notext2 ON im_notext1.nt1_id = im_notext2.nt1_id WHERE ((nt1_id > ?)) ORDER BY nt1_id ASC]
Using parameterList:[244029]