JPQL setFirstResult / setMaxResults возвращает недопустимое значение SQL - PullRequest
0 голосов
/ 29 января 2020

Внутри проекта 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. Query Results

Есть ли способ изменить JPQL для создания второго SQL или решить проблему другим способом? Любой комментарий будет полезен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...