57

我遇到了一个简单的问题;苦苦挣扎如何order byjoined 实体上调用。本质上,我试图通过以下方式实现以下目标JPA Criteria

select distinct d from Department d 
left join fetch d.children c 
left join fetch c.appointments a
where d.parent is null 
order by d.name, c.name

我有以下内容:

CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
CriteriaQuery<Department> c = cb.createQuery(Department.class);
Root<Department> root = c.from(Department.class);
Fetch<Department, Department> childrenFetch = root.fetch(
    Department_.children, JoinType.LEFT);
childrenFetch.fetch(Department_.appointments, JoinType.LEFT);

c.orderBy(cb.asc(root.get(Department_.name)));
c.distinct(true);
c.select(root);
c.where(cb.isNull(root.get(Department_.parent)));

如何order by d.name, c.name实现Criteria API?我尝试了 Expression, Path 但没有用。任何指针将不胜感激。

4

5 回答 5

86

如果您需要添加几个订单,您可以制作类似的东西(但对于您的查询和不同的根对象)

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Route> query = criteriaBuilder.createQuery(Route.class);
Root<Route> routeRoot = query.from(Route.class);
query.select(routeRoot);

List<Order> orderList = new ArrayList();
query.where(routeRoot.get("owner").in(user));

orderList.add(criteriaBuilder.desc(routeRoot.get("date")));
orderList.add(criteriaBuilder.desc(routeRoot.get("rating")));

query.orderBy(orderList);
于 2014-12-31T16:45:01.083 回答
17

通过使用 Criteria API,我对订单有同样的问题。我找到了这个解决方案:

CriteriaQuery<Test> q = cb.createQuery(Test.class);
Root<Test> c = q.from(Test.class);
q.select(c);
q.orderBy(cb.asc(c.get("name")), cb.desc(c.get("prenom")));
于 2018-01-29T09:36:39.270 回答
9

我在做同样的事情时遇到了麻烦,我在这个页面上找到了一个解决方案: http ://www.objectdb.com/api/java/jpa/criteria/CriteriaQuery/orderBy_Order_

//javax.persistence.criteria.CriteriaQuery
//CriteriaQuery<T> orderBy(Order... o)

指定用于对查询结果进行排序的排序表达式。替换之前的排序表达式(如果有)。如果未指定排序表达式,则简单地删除先前的排序(如果有),并且将不按特定顺序返回结果。排序表达式的从左到右的顺序决定了优先级,其中最左边的优先级最高。

参数:o - 零个或多个排序表达式

返回:修改后的查询

自:JPA 2.0

于 2013-12-15T03:13:55.727 回答
0

对我有用的解决方案如下

session=HibernateUtil.getSessionJavaConfigFactory_report().openSession();
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Object[]> criteriaQuery = builder.createQuery(Object[].class);
List<Order> orderList = new ArrayList();
orderList.add(builder.desc(ejeRoot.get("name")));
criteriaQuery.orderBy(orderList);

注意:ejeRoot 是类对象

于 2019-03-31T15:42:55.440 回答
-2

categoryRepository.findAll(predicates, new Sort(Direction.ASC, "sortOrder", "name")) .forEach(categoryDtoList::add);

于 2018-03-29T05:22:06.730 回答