这周,我正在研究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);
...
这几乎是文档建议创建查询(see here)的方式。
在日志中,我看到这会生成一个SQL查询,如下所示:
select * from (
select lots_of_columns from some_view order by selected_column
) where rownum <= 50
自从Oralce 10开始以来,根据文档,封闭的select的顺序无效,并且,如果我没记错的话,根据关系代数这也很有意义。我们使用Oracle 12c。
所以我的问题是,我应该如何正确解决这个问题?
我发现应该使用offset
和fetch
,但是我找不到如何告诉JPA相应地生成SQL的方法。我也发现了一条建议将id添加到order by子句的帖子,但这也不能解决问题。
预先感谢您对此主题的任何想法和提示。