【问题标题】:JPA Criteria Query API and order by two columnsJPA Criteria Query API 和两列排序
【发布时间】:2013-08-25 17:03:56
【问题描述】:

我遇到了一个简单的问题;苦苦挣扎如何在joined 实体上调用order by。本质上,我试图通过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.nameCriteria API如何实现?我尝试了 Expression, Path 但没有用。 任何指针将不胜感激。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我在使用 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】:

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

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

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

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

        返回: 修改后的查询

        因为: JPA 2.0

        【讨论】:

        • 作者描述的问题的答案如何?
        • 你为什么不这么认为?他想知道,如何按多个属性排序。我的答案包含如何做到这一点......我错过了什么吗?
        • 因为它不适用于连接表中的 distinct 和按属性排序
        【解决方案4】:

        对我有用的解决方案如下

        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 是类对象

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 这可用于根据 sortOrder 和 name 对列表进行排序,如果 sortOrder 基于名称相同,它将对元素进行排序
          • 这仅适用于 Spring Data 用户。
          猜你喜欢
          • 2017-05-02
          • 2015-02-26
          • 2017-09-26
          • 2012-09-07
          • 2018-08-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-02
          相关资源
          最近更新 更多