Lote de primavera com alias de coluna como chave de classificação - instrução "where" malformada
Estou usando o Spring-batch versão 3.0.6.RELEASE para consultar alguns dados do MySQL DB e depois processá-los.
Detalhes sobre o uso:
provedor de consulta éMySqlPagingQueryProvider
ao configurar o provedor de consulta, estou especificando um alias de uma das colunas na consulta como osort key
(por favor, verifique a consulta abaixo para mais detalhes)Inquerir:
SELECT
target.tx_timestamp AS event_datetime,
....
FROM
some_table AS target
....
WHERE
target.tx_timestamp > :startTime AND target.tx_timestamp <= :endTime;
O código:
Map<String, Order> sortKeys = new HashMap<>();
sortKeys.put("event_datetime", Order.ASCENDING);
MySqlPagingQueryProvider queryProvider = new MySqlPagingQueryProvider();
queryProvider.setSortKeys(sortKeys);
A consulta gerada (observe a parte comevent_datetime):
WHERE
(target.tx_timestamp > ? AND target.tx_timestamp <= ?) AND
((event_datetime > ?))
O erro:
org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar .... Unknown column 'event_datetime' in 'where clause'.
É possível usar o alias como a chave de classificação?
Também digno de nota sãoesta discussão com o mesmo problema eeste ingresso Jira lote da primavera que está marcado como resolvido para a versão 3.0.4.
Também tentei usar as versões 3.0.4.RELEASE, 3.0.5.RELEASE e 3.0.7.RELEASE com o mesmo resultado.
Editar: Depois de mais algumas tentativas, posso acrescentar que o problema surge apenas quando há registros suficientes para mais de uma página. A consulta para a primeira página passa sem problemas, mas as consultas para as páginas subseqüentes falham.
Edit2: Conforme apontado por Sabir, o problema está de fato com o alias da coluna na cláusula where. O lote da primavera está funcionando corretamente neste caso.
Para pessoas que enfrentam o mesmo problema: Para solucionar esse problema, aninhe toda a consulta em outra seleção como esta:
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;
Desconhecido para mim no momento em que postei a pergunta, o alias não pode ser usado na cláusula WHERE e desde que o lote da primavera recebeu o aliasevent_datetime
como chave de classificação, as consultas para pedaços após o primeiro foram geradas com condições adicionais baseadas em chaves de classificação.
Com a consulta acima, a seleção interna é avaliada antes que o lote da primavera tenha adicionado a condição WHERE e, em seguida, o uso do alias da coluna para a chave de classificação seja possível.