如何在JPA中使用TypedQuery更改顺序

问题描述 投票:1回答:2

我希望通过FIQL支持实现分页。我正在使用apache cxf和JPA(Hibernate)。以下是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子句,似乎遵循数据库插入顺序。现在我想更改默认排序顺序。例如,我希望按降序排序订单ID字段。我怎样才能做到这一点?

java hibernate jpa cxf jpql
2个回答
1
投票

我可以使用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();

0
投票

创建查询后无法更改顺序。

如果您使用MySQL,那么也许您可以在ORDER BY :colnum DESC中使用整数参数来指定要排序的列号(仅从所选列的1开始),但您无法更改方向。

PostgreSQL不允许你这样做。不过,我不知道它在其他数据库上是怎么回事。使用MySQL,参数将被SQL驱动程序替换,因此它始终接收带有转义序列的完整查询。使用PG,首先由服务器解析查询,创建执行计划(包括是否以及如何对结果进行排序),然后发送参数。

© www.soinside.com 2019 - 2024. All rights reserved.