【问题标题】:Get rows based on maximum value for subsets of a table根据表子集的最大值获取行
【发布时间】:2015-11-21 14:55:43
【问题描述】:

我想根据一列的值过滤表,然后获取每个值的最大值。

例如

id | value
-----------
0  | 10
0  | 22
0  | 50
1  | 33
1  | 4
2  | 5
2  | 23
2  | 33
3  | 22
3  | 50

按ID为2和3的行过滤,然后得到每个id的最大值

id | value
-----------
2  | 33
3  | 50

我如何通过休眠来使用它?

这是我的尝试:

    List<int> ids = ... // Retreived from elsewhere

    Disjunction disjunction = Restrictions.disjunction();
    for(int id: ids){
        disjunction.add(Restrictions.eq("id", id));    // Specify which IDs
    }

    @SuppressWarnings("unchecked")
    List<Item> items= (List<Item>) sessionFactory.getCurrentSession()
            .createCriteria(Item.class)
            .add(disjunction)
            .setProjection(
                Projections.projectionList()
                    .add(Projections.max("value"))
                    .add(Projections.groupProperty("id")
                )
            )
            .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
            .list();

这只是给我最高值的“id”(例如 3,而不是整行)

我正在尝试在 spring mvc 应用程序中执行此操作。

提前致谢

【问题讨论】:

    标签: java hibernate spring-mvc


    【解决方案1】:
    select MAX(id),max(value) from ABCD where id in (110,56001) group by id
    

    尝试在表单中执行此查询以获得预期的输出。

    【讨论】:

      【解决方案2】:

      您可以在CriteriaQuery 中指定WHERE 子句,然后进行多选以执行GROUP BY

      CriteriaBuilder cb = em.getCriteriaBuilder();
      CriteriaQuery<Object[]> query = cb.createQuery(Object[].class);
      Root<Item> item = query.from(Item.class);
      query.where(cb.equal(item.get("id"), 2));
      query.where(cb.equal(item.get("id"), 3));
      query.multiselect(item.get("id"), item.max("value")).groupBy(item.get("id"));
      
      List<Object[]> results = em.createQuery(query).getResultList();
      System.out.println("id | value\n-----------");
      for(Object[] object : results){
          System.out.println(object[0] + " | " + object[1]);
      }
      

      【讨论】:

      • 有什么方法可以使用hibernate的标准而不是jpa标准构建器来做到这一点?
      猜你喜欢
      • 2015-02-01
      • 2019-05-29
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-18
      • 1970-01-01
      相关资源
      最近更新 更多