Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用SortKey和参数值的Spring批处理分页_Java_Mysql_Spring_Spring Batch_Spring Boot - Fatal编程技术网

Java 使用SortKey和参数值的Spring批处理分页

Java 使用SortKey和参数值的Spring批处理分页,java,mysql,spring,spring-batch,spring-boot,Java,Mysql,Spring,Spring Batch,Spring Boot,我有一个Spring批处理项目在Spring Boot中运行,运行得非常好。对于我的阅读器,我将JdbcPagingItemReader与MySqlPagingQueryProvider一起使用 @Bean public ItemReader<Person> reader(DataSource dataSource) { MySqlPagingQueryProvider provider = new MySqlPagingQueryProvider() provide

我有一个Spring批处理项目在Spring Boot中运行,运行得非常好。对于我的阅读器,我将JdbcPagingItemReader与MySqlPagingQueryProvider一起使用

@Bean
public ItemReader<Person> reader(DataSource dataSource) {
    MySqlPagingQueryProvider provider = new MySqlPagingQueryProvider()
    provider.setSelectClause(ScoringConstants.SCORING_SELECT_STATEMENT)
    provider.setFromClause(ScoringConstants.SCORING_FROM_CLAUSE)
    provider.setSortKeys("p.id": Order.ASCENDING)

    JdbcPagingItemReader<Person> reader = new JdbcPagingItemReader<Person>()
    reader.setRowMapper(new PersonRowMapper())
    reader.setDataSource(dataSource)
    reader.setQueryProvider(provider)
    //Setting these caused the exception
    reader.setParameterValues(
        startDate: new Date() - 31,
        endDate: new Date()
    ) 
    reader.afterPropertiesSet()
    return reader
}
下面是一个SQL示例,默认情况下它并没有WHERE子句。读取第二页时会自动创建一个:

select *, (select id from family f where date_created between :startDate and :endDate and f.creator_id = p.id)  from person p
在第二页上,sql被修改为以下内容,但是似乎没有提供_id的命名参数:

select *, (select id from family f where date_created between :startDate and :endDate and f.creator_id = p.id) from person p WHERE id > :_id

我想知道我是否不能简单地将MySqlPagingQueryProvider排序键与JdbcPagingItemReader中设置的其他命名参数一起使用。如果没有,解决这个问题的最佳替代方案是什么?我需要能够为查询提供参数并对其进行分页(与使用光标相比)。谢谢大家!

我通过密集的调试解决了这个问题。事实证明,MySqlPagingQueryProvider在构建SQL查询以运行第一个页面和后续页面时,使用了一个方法
getSortKeyswithoutAlias()
。因此,它附加了
和(p.id>:\u id)
,而不是
和(p.id>:\u p.id)
。稍后,当第二个页面排序值被创建并存储在JdbcPagingItemReader的
startAfterValues
字段中时,它将使用指定的原始
“p.id”
字符串,并最终将该对
(“\p.id”,10)
放入命名参数映射中。但是,当读取器尝试在查询中填写_id时,它不存在,因为读取器使用了非别名移除键

长话短说,在定义排序键时,我必须删除别名引用

provider.setSortKeys(“p.id:Order.升序)

为了使所有的东西都能很好地协同工作,必须更改为


provider.setSortKeys(“id”:Order.升序)

我遇到了同样的问题,得到了另一个可能的解决方案

我的表T有一个主键字段INTERNAL_ID

JdbcPagingItemReader中的查询如下:

SELECT INTERNAL_ID, ... FROM T WHERE ... ORDER BY INTERNAL_ID ASC
因此,关键是:在某些情况下,查询没有返回结果,然后,将错误提高到没有提供任何值的程度

解决办法是:

  • 如果有行,则检查Spring批decider元素
  • 如果是,请继续执行chunk:reader-processor-writer
  • 它不是,转到另一个步骤
请注意,它们是两种不同的场景:

  • 开始时,有行。通过分页获得它们,最后,不再有行了。这没有问题,不需要决策技巧
  • 开始时,没有行。然后,这个错误出现了,决策者解决了它

希望这有帮助。

您似乎没有为新值设置where子句。您的配置示例中缺少了这一点吗?@MichaelMinella感谢您的帮助。我在上面提供了一些SQL。我的初始查询中没有WHERE子句,但是分页提供程序会在第一页后自动添加一个WHERE子句。我的意思是,在配置提供程序时,您没有为startDate和endDate设置WHERE子句,或者我遗漏了什么?@MichaelMinella,请注意WHERE子句中没有使用这些子句,而是在一个次级选区。您是否认为出于某种原因,这会导致我对_id字段的问题?我意识到我可以将其更改为连接而不是子选择,并使用where子句,但我有许多额外的子选择,它们不能成为连接,为了减少混淆,我删除了这些子选择。该查询经过测试并正常工作。正如我所说,第1页功能良好,直到第2页where子句自动添加,命名的_id参数才被绑定。再次感谢你!看看这个函数以及getParameterMap函数是如何工作的,它显然涵盖了它。有没有可能打开日志记录并查看“使用parameterMap”的输出?
SELECT INTERNAL_ID, ... FROM T WHERE ... ORDER BY INTERNAL_ID ASC