Java JPA条件查询API和按两列排序

Java JPA条件查询API和按两列排序,java,jpa,sql-order-by,criteria-api,Java,Jpa,Sql Order By,Criteria Api,我被一个简单的问题困住了;如何在joined实体上调用order by。基本上,我正试图通过JPA标准实现以下目标: 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 = getEntityMana

我被一个简单的问题困住了;如何在
join
ed实体上调用
order by
。基本上,我正试图通过
JPA标准
实现以下目标:

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)));
CriteriaBuilder cb=getEntityManager().getCriteriaBuilder();
CriteriaQuery c=cb.createQuery(Department.class);
Root=c.from(Department.class);
Fetch childrenFetch=root.Fetch(
部门(儿童,JoinType.左);
childrenFetch.fetch(部门预约,JoinType.LEFT);
c、 orderBy(cb.asc(root.get(Department.name));
c、 清晰(真实);
c、 选择(根);
c、 其中(cb.isNull(root.get(Department.parent));
如何使用
标准API
实现按d.name、c.name排序的
?我试着表达,但没有成功。

任何提示都将不胜感激。

我在做同样的事情时遇到困难,我在本页上找到了解决方案:

//javax.persistence.criteria.CriteriaQuery
//CriteriaQuery orderBy(订单…o)
指定用于对查询结果进行排序的排序表达式。替换以前的排序表达式(如果有)。如果未指定排序表达式,则只需删除以前的排序(如果有),结果将不按特定顺序返回。排序表达式从左到右的顺序决定了优先级,其中最左边的优先级最高

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

返回: 修改后的查询

自: JPA2.0


如果您需要添加两个订单,您可以进行如下操作(但对于您的查询和不同的根对象)

CriteriaBuilder-CriteriaBuilder=entityManager.getCriteriaBuilder();
CriteriaQuery=criteriaBuilder.createQuery(Route.class);
根routeRoot=query.from(Route.class);
查询.选择(routeRoot);
List orderList=new ArrayList();
查询.where(routeRoot.get(“所有者”).in(用户));
添加(criteriaBuilder.desc(routeRoot.get(“日期”));
添加(criteriaBuilder.desc(routeRoot.get(“评级”));
query.orderBy(orderList);

通过使用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")));
CriteriaQuery q=cb.createQuery(Test.class);
根c=q.from(测试类);
q、 选择(c);
q、 订购人(cb.asc(c.get(“name”))、cb.desc(c.get(“prenom”));

categoryRepository.findAll(谓词,新排序(Direction.ASC,“sortOrder”,“name”))

.forEach(类别列表::添加)

对我有效的解决方案如下

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);
session=HibernateUtil.getSessionJavaConfigFactory_report().openSession();
CriteriaBuilder=session.getCriteriaBuilder();
CriteriaQuery CriteriaQuery=builder.createQuery(对象[].class);
List orderList=new ArrayList();
添加(builder.desc(ejeRoot.get(“name”));
criteriaQuery.orderBy(orderList);

注意:ejeRoot是类对象

这是如何回答作者描述的问题的?为什么你认为它不是?他想知道,如何按多个属性排序。我的答案包括如何做到这一点。。。我遗漏了什么吗?因为它不适用于联接表中的distinct和sorting by property这可用于基于sortOrder和name对列表进行排序,如果sortOrder基于将对元素进行排序的名称相同,则这仅适用于Spring数据用户。
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")));
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);