Trochę spóźniona odpowiedź, ale może być pomocna, więc ją opublikuję. Miałem dokładnie ten sam problem i ból głowy, żeby go wyśledzić. Rozwiązaniem jest użycie org.hibernate.dialect.SQLServer2012Dialect
który jest zawarty w Hibernate 4.3.0. Wygenerowane zapytanie staje się (wklejenie prawdziwego zrzutu Hibernate bez nazw kolumn i aliasów):
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__ < ?
Zwróć uwagę na użycie wewnętrznego zapytania i Row_number()
funkcjonować. W końcu to rozwiązali!