Una respuesta un poco tardía, pero puede ser útil, así que la publicaré. Tenía exactamente el mismo problema y un dolor de cabeza para rastrearlo. La solución es usar org.hibernate.dialect.SQLServer2012Dialect
que está incluido en Hibernate 4.3.0. La consulta generada se convierte en (pegando el volcado real de Hibernate sin nombres de columna ni alias):
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 el uso de consultas internas y Row_number()
función. ¡Al fin lo resolvieron!