JPA Criteria查询API并按两列排序

时间:2013-08-22 19:37:33

标签: java jpa sql-order-by criteria-api

我遇到了一个简单的问题;努力如何在order by ed实体上调用join。基本上我试图通过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但是没有用。 任何指针都将非常感激。

5 个答案:

答案 0 :(得分:49)

如果你需要添加几个订单,你可以做类似的事情(但是对于你的查询和不同的根对象)

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);

答案 1 :(得分:8)

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

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

指定用于排序查询结果的排序表达式。替换以前的排序表达式(如果有)。如果未指定排序表达式,则仅删除先前的排序(如果有),并且将以无特定顺序返回结果。排序表达式的从左到右的序列确定优先级,其中最左边的优先级最高。

     

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

     

返回:      修改后的查询

     

自:      JPA 2.0

答案 2 :(得分:8)

我使用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")));

答案 3 :(得分: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是类对象

答案 4 :(得分:-1)

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