Как изменить порядок с TypedQuery в JPA - PullRequest
0 голосов
/ 27 июня 2018

Я хочу реализовать пейджинг с поддержкой 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, и, похоже, следуют порядку вставки базы данных. Теперь я хочу изменить порядок сортировки по умолчанию. Например, я хочу отсортировать по полю идентификатора заказа в порядке убывания. Как мне этого добиться?

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Я могу заставить его работать с использованием 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 голосов
/ 28 июня 2018

Вы не можете изменить порядок после создания запроса.

Если вы используете MySQL, то, возможно, вы можете использовать целочисленный параметр в ORDER BY :colnum DESC, чтобы указать номер столбца, по которому производится сортировка (начиная с 1 только из выбранных столбцов), но вы не можете изменить направление.

PostgreSQL не позволяет вам делать это. Я не знаю, как это на других базах данных, хотя. В MySQL параметры заменяются драйвером SQL, поэтому он всегда получает полный запрос с экранированными последовательностями. С PG запрос сначала анализируется сервером, создается план выполнения (включая, если и как упорядочить результаты), а затем параметры отправляются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...