【问题标题】:How to change order with TypedQuery in JPA如何在 JPA 中使用 TypedQuery 更改顺序
【发布时间】:2018-06-27 14:55:33
【问题描述】:

我希望使用 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 字段按降序排序。我怎样才能做到这一点?

【问题讨论】:

标签: java hibernate jpa cxf jpql


【解决方案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();

【讨论】:

  • 非常感谢!我整天都在寻找这个解决方案!
【解决方案2】:

创建查询后不能更改顺序。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 2018-08-30
    • 2019-01-16
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    相关资源
    最近更新 更多