Spring batch 使用JdbcPagingItemReader导致join语句导致MySQLIntegrityConstraintViolationException

Spring batch 使用JdbcPagingItemReader导致join语句导致MySQLIntegrityConstraintViolationException,spring-batch,Spring Batch,我正在运行Spring批处理并使用JdbcPagingItemReader。示例配置为: 您对其发生原因的推理是正确的。在您的情况下,我希望使用您的别名来解决问题。因此,您将owner.id化名为ownerid,但在sortkey字段(或join子句)中不使用它。使用别名应该没问题。显然,这似乎仍在以某种形式发生,但有办法精心设计查询,以避免删除别名。通过使用其他名称选择连接的列,可以重命名该列 您的select子句变为 SELECT owner.id, owner.first_name,

我正在运行Spring批处理并使用
JdbcPagingItemReader
。示例配置为:



您对其发生原因的推理是正确的。在您的情况下,我希望使用您的别名来解决问题。因此,您将
owner.id
化名为
ownerid
,但在
sortkey
字段(或join子句)中不使用它。使用别名应该没问题。

显然,这似乎仍在以某种形式发生,但有办法精心设计查询,以避免删除别名。通过使用其他名称选择连接的列,可以重命名该列

您的select子句变为

SELECT owner.id, owner.first_name, owner.last_name, dog.dog_name
      FROM dog_owner owner
INNER JOIN (SELECT d2.id AS dogId, d2.dog_name
              FROM dog d2) AS dog
        ON owner.id = dog.dogId
从句变成

SELECT owner.id, owner.first_name, owner.last_name, dog.dog_name
      FROM dog_owner owner
INNER JOIN (SELECT d2.id AS dogId, d2.dog_name
              FROM dog d2) AS dog
        ON owner.id = dog.dogId

现在您应该能够使用“id”作为sortKey,因为只有一列名为“id”。即使您将dog.dogId添加到selectClause中,这种方法也能起作用。

我们遇到了这个问题,Spring必须从返回的结果集中获取您的排序键才能正确分页。在hood下,sort键用于WHERE子句,该子句不会处理列别名,因为WHERE在数据库级别的SELECT语句之前得到处理


我们的解决方案是
选择owner.id作为“owner.id”
,这样就可以使用相同的名称从结果集中检索排序键。执行
SELECT owner.id
操作会将列
id
放入结果集中,这会导致列不明确的问题。与前面答案的嵌套查询相比,我们更喜欢这种方法。

感谢您的反馈。我一开始就试过了。我认为这对于firstPageSql查询的工作查询是有效的,但生成的RemainingPageSQL似乎无效,因为我在查询中得到了类似于WHERE((ownerid>?)的内容,从而导致MySQLSyntaxErrorException:WHERE子句中的未知列“ownerid”。不确定我是否缺少配置。临时修复程序是覆盖MySqlPagingQueryProvider。我本以为这个用例很常见,但实际上我认为这是一个bug。我已经创建了Jira问题批次-2360来跟踪它()。仅供参考。在使用H2数据库进行测试时,我遇到了相同的错误。我认为H2PagingQueryProvider仍然没有修复。为什么sortkey在spring批处理中是必需的。。有什么原因吗?理想情况下,它应该是可选的,或者在默认情况下,如果。。。我不明白spring为什么要强迫开发人员使用排序键