Risposta un po' in ritardo, ma può essere utile quindi la posterò. Aveva lo stesso identico problema e un mal di testa per rintracciarlo. La soluzione è usare org.hibernate.dialect.SQLServer2012Dialect
che è incluso in Hibernate 4.3.0. La query generata diventa (incollando il dump di Hibernate reale senza nomi di colonna e 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__ < ?
Nota l'uso della query interna e di Row_number()
funzione. Alla fine hanno risolto!