На этой неделе я изучал проблему сортировки в WebApp.Сортировка таблицы в браузере по выбранному столбцу не работает должным образом.Оказалось, что в приложении мы использовали JPA CriteriaQuery
для создания запроса, а затем создали TypedQuery
для разбивки на страницы следующим образом:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<SomeEntity> q = cb.createQuery(SomeEntity.class);
Root<SomeEntity> c = q.from(SomeEntity.class);
q.select(c);
...
q.orderBy(cb.asc(c.get("SomeColumn")));
TypedQuery<> query = em.createQuery(q);
query.setFirstResult(pageIx * pageSize);
query.setMaxResults(pageSize);
...
Это в значительной степени то, что документация предлагает создатьзапросы ( см. здесь ).
В журналах я видел, что это генерирует SQL-запрос, подобный следующему:
select * from (
select lots_of_columns from some_view order by selected_column
) where rownum <= 50
Начиная с Oralce 10 упорядочение вложенного выборане имеет никакого эффекта в соответствии с документацией, и, если я правильно помню, это также имеет смысл в соответствии с реляционной алгеброй.Мы используем Oracle 12c.
Итак, мой вопрос: как мне правильно это понять?Я обнаружил, что offset
и fetch
должны быть использованы, но я не мог найти, как сказать JPA для генерации SQL соответственно.Также я нашел сообщение, в котором предлагалось добавить идентификатор к заказу по предложению, однако это также не решило проблему.
Заранее благодарю за любые мысли и подсказки по теме.