Внутри проекта JEE7 и JAVA 8, использующего базы данных EclipseLink и Oracle, у меня следующий запрос JPQL:
SELECT notification
FROM VIEW_IN_DB notification
WHERE NOTIFICATION_RECIPIENT = :notification_recipient
ORDER BY notification.creationDate
В JAVA до (List<VIEW_IN_DB>) query.getResultList()
Я установил FirstResult и MaxResults параметры запроса.
Из журналов связано SQL:
SELECT *
FROM (SELECT
a.*,
ROWNUM rnum
FROM (SELECT
ID AS a1,
CREATION_DATE AS a3,
NOTIFICATION_RECIPIENT AS a8,
...
FROM VIEW_IN_DB
WHERE (NOTIFICATION_RECIPIENT = ?)
ORDER BY CREATION_DATE ASC) a
WHERE ROWNUM <= ?)
WHERE rnum > ?
Когда я проверяю результаты, я вижу, что набор результатов с параметрами FirstResult = 0 и MaxResults = 10 содержит элементы, которые делают не существует в наборе результатов, когда я устанавливаю FirstResult = 0 и MaxResults = 20.
Это говорит о том, что ROWNUM, добавляемый JPQL, не работает должным образом. Когда я вручную изменяю SQL на следующий запрос, результаты верны:
SELECT *
FROM (SELECT
a.*,
a.a12 rnum
FROM (SELECT
ID AS a1,
CREATION_DATE AS a3,
NOTIFICATION_RECIPIENT AS a8,
...
ROWNUM AS a12
FROM VIEW_IN_DB
WHERE (NOTIFICATION_RECIPIENT = ?)
ORDER BY CREATION_DATE ASC) a
WHERE a.a12 <= ?) a
WHERE a.rnum > ?
И когда я печатаю результаты следующего SQL:
SELECT *
FROM (SELECT
a.*,
ROWNUM rnum
FROM (SELECT
ID AS a1,
CREATION_DATE AS a3,
NOTIFICATION_RECIPIENT AS a8,
...
ROWNUM as a12
FROM VIEW_IN_DB
WHERE (NOTIFICATION_RECEPIENT = ?)
ORDER BY CREATION_DATE ASC) a
WHERE ROWNUM <= 20)
WHERE rnum > 0
Результаты из а12 это не то же самое, что RNUM.
Есть ли способ изменить JPQL для создания второго SQL или решить проблему другим способом? Любой комментарий будет полезен.