Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.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
Mysql 列别名作为排序键的Spring批处理-格式错误的“where”语句_Mysql_Spring Batch - Fatal编程技术网

Mysql 列别名作为排序键的Spring批处理-格式错误的“where”语句

Mysql 列别名作为排序键的Spring批处理-格式错误的“where”语句,mysql,spring-batch,Mysql,Spring Batch,我使用SpringBatch版本3.0.6.RELEASE查询MySQL数据库中的一些数据,然后对其进行处理 有关用法的详细信息: 查询提供程序是MySqlPagingQueryProvider 设置查询提供程序时,我将查询中某列的别名指定为排序键。有关详细信息,请查看下面的查询 查询: SELECT target.tx_timestamp AS event_datetime, .... FROM some_table AS target .... WHERE

我使用SpringBatch版本3.0.6.RELEASE查询MySQL数据库中的一些数据,然后对其进行处理

有关用法的详细信息:

查询提供程序是MySqlPagingQueryProvider 设置查询提供程序时,我将查询中某列的别名指定为排序键。有关详细信息,请查看下面的查询 查询:

SELECT
    target.tx_timestamp AS event_datetime,
    ....
FROM
    some_table AS target
    ....
WHERE
    target.tx_timestamp > :startTime AND target.tx_timestamp <= :endTime;
是否可以使用别名作为排序键

同样值得注意的是,在3.0.4版中标记为已解决的相同问题

我还尝试过使用3.0.4.RELEASE、3.0.5.RELEASE和3.0.7.RELEASE版本,结果相同

编辑: 经过几次尝试后,我可以补充说,只有当有足够的记录用于多个页面时,才会出现问题。第一页的查询通过,没有问题,但后续页的查询失败

编辑2: 正如Sabir所指出的,问题实际上是where子句中的列别名。在这种情况下,Spring batch工作正常

对于遇到相同问题的人: 您可以通过将整个查询嵌套在另一个select中来解决此问题,如下所示:

SELECT * FROM (
    SELECT
        target.tx_timestamp AS event_datetime,
        ....
    FROM
        some_table AS target
        ....
    WHERE
        target.tx_timestamp > :startTime AND target.tx_timestamp <= :endTime) our_inner_select;
当我发布问题时我还不知道,别名不能在WHERE子句中使用,而且由于spring batch被赋予别名event_datetime作为排序键,因此在第一个查询之后的块查询是根据排序键生成的,并带有附加条件


通过上面的查询,在spring批处理添加WHERE条件之前对内部select进行评估,然后可以使用列别名作为排序键。

当您将select的列别名指定为排序键时,第1页,即除第0页外,Spring Batch生成的后续查询在WHERE子句中使用该别名,如您的问题所示,并且根据,如果WHERE子句之前未强制计算SELECT子句,则不允许在WHERE子句中使用列别名


所以要回答您的问题-不,您不能使用别名作为排序键,除非您按照其他SQL问题中的建议强制别名求值

我们遇到了这个问题,Spring必须从返回的结果集中获取排序键才能正确分页。正如前面的答案所解释的,排序键在WHERE子句中使用,该子句不适用于列别名


我们的解决方案是选择target.tx_timestamp作为target.tx_timestamp,以便可以使用相同的名称从结果集中检索排序键。执行SELECT target.tx_timestamp会将列tx_timestamp放入结果集中,这会导致问题,因为排序键需要是target.tx_timestamp。与嵌套查询相比,我们更喜欢这种方法。

您能提供完整生成的查询吗?这是@Michael Minella的副本吗?我无权这么做,但我有一些好消息,问题不在spring batch中,请查看原始帖子中的Edit2。您是对的,where子句中的列别名是问题所在。谢谢
WHERE
    (target.tx_timestamp > ? AND target.tx_timestamp <= ?) AND
    ((event_datetime > ?))
org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar .... Unknown column 'event_datetime' in 'where clause'.
SELECT * FROM (
    SELECT
        target.tx_timestamp AS event_datetime,
        ....
    FROM
        some_table AS target
        ....
    WHERE
        target.tx_timestamp > :startTime AND target.tx_timestamp <= :endTime) our_inner_select;