Resposta um pouco atrasada, mas pode ser útil, então vou postar. Tive exatamente o mesmo problema e uma dor de cabeça para rastreá-lo. A solução é usar
org.hibernate.dialect.SQLServer2012Dialect
que está incluído no Hibernate 4.3.0. A consulta gerada se torna (colando o dump real do Hibernate sem nomes de coluna e aliases):WITH query
AS (SELECT inner_query.*,
Row_number()
OVER (
ORDER BY CURRENT_TIMESTAMP) AS __hibernate_row_nr__
FROM (SELECT TOP(?) <COLUMN_NAMES> AS <ALIASES>
FROM <TABLE_NAME>
) inner_query)
SELECT <ALIASES>
FROM query
WHERE __hibernate_row_nr__ >= ?
AND __hibernate_row_nr__ < ?
Observe o uso de consulta interna e
Row_number()
função. Finalmente resolveram!