java - 如何在 JPA 中使用 TypedQuery 更改顺序
问题描述
我希望使用 FIQL 支持实现分页。我正在将 apache cxf 与 JPA(休眠)一起使用。这是给出的示例http://cxf.apache.org/docs/jax-rs-search.html#JAX-RSSearch-JPA2.0
SearchConditionVisitor<Order, TypedQuery<Order>> visitor
= new JPATypedQueryVisitor<>(em, Order.class);
// connect FIQL cxf SearchCondition with our JPA visitor
searchCondition.accept(visitor);
// creeate JPA specific TypedQuery by our visitor
TypedQuery<Order> typedQuery = visitor.getQuery();
typedQuery.setFirstResult((page * perPage) - perPage);
typedQuery.setMaxResults(perPage);
// Run the query and return matching a complex FIQL criteria
return typedQuery.getResultList();
每件事看起来都在工作,包括搜索和分页。它看起来没有从生成 sql 日志中使用的 order by 子句,并且似乎遵循数据库插入顺序。现在我想更改默认排序顺序。例如,我希望按 Order id 字段按降序排序。我怎样才能做到这一点?
解决方案
我可以使用 CriteriaQuery 让它工作。
JPACriteriaQueryVisitor<Order, Order> jpa
= new JPACriteriaQueryVisitor<>(em, Order.class, Order.class);
searchCondition.accept(jpa);
CriteriaQuery<Order> cq = jpa.getCriteriaQuery();
CriteriaBuilder cb = em.getCriteriaBuilder();
Root<Order> root = (Root<Order>) cq.getRoots().iterator().next();
cq.orderBy(cb.desc(root.get("id")));
TypedQuery<Order> query = jpa.getTypedQuery();
query.setFirstResult((page * perPage) - perPage);
query.setMaxResults(perPage);
return query.getResultList();
推荐阅读
- linux - Linux SIGSTOP causes waitpid to continue
- flutter - Retrive data according to App Language on Flutter
- mongodb - is there a way to check if a given field exists in pyspark and mongodb?
- c - Using strtok and trying to store their values into an array
- python - 如何在 Elif Python 中添加多个值?
- java - Android:确保光标已正确初始化
- html - 我怎样才能使 div 100% 的窗口宽度同时父的宽度是 95.5%?
- asp.net-mvc - 如何在 mvc 5 应用程序中将 https 重定向到 http
- java - SpringApplicationBuilder 结合小型 SpringBoot 应用程序(模块化单体)
- javascript - aws lambda 中的archiver.js 内存泄漏