Java 基于表子集的最大值获取行

Java 基于表子集的最大值获取行,java,hibernate,spring-mvc,Java,Hibernate,Spring Mvc,我想根据一列的值筛选一个表,然后获取每个值的最大值 e、 g 按id为2和3的行进行筛选,然后获取每个id的最大值 id | value ----------- 2 | 33 3 | 50 如何使用hibernate使用它 这是我的尝试: List<int> ids = ... // Retreived from elsewhere Disjunction disjunction = Restrictions.disjunction(); for(in

我想根据一列的值筛选一个表,然后获取每个值的最大值

e、 g

按id为2和3的行进行筛选,然后获取每个id的最大值

id | value
-----------
2  | 33
3  | 50
如何使用hibernate使用它

这是我的尝试:

    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=…//从别处检索
析取析取=限制。析取();
for(int-id:ids){
disjunction.add(Restrictions.eq(“id”,id));//指定哪些id
}
@抑制警告(“未选中”)
列表项=(列表)sessionFactory.getCurrentSession()
.createCriteria(Item.class)
.add(析取)
.setProjection(
投影。投影列表()
.add(Projections.max(“值”))
.add(Projections.groupProperty(“id”)
)
)
.setResultTransformer(标准.DISTINCT\u ROOT\u实体)
.list();
这只是给我一个具有最高值的“id”(例如,3,而不是整行)

我正试图在SpringMVC应用程序中实现这一点


提前感谢

您可以在
标准查询
中指定一个
WHERE
子句,然后进行多选以按分组:

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]);
}
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery=cb.createQuery(对象[].class);
根项=query.from(item.class);
其中(cb.equal(item.get(“id”),2));
其中(cb.equal(item.get(“id”),3));
query.multiselect(item.get(“id”)、item.max(“value”).groupBy(item.get(“id”));
List results=em.createQuery(query.getResultList();
System.out.println(“id | value\n------------”;
对于(对象[]对象:结果){
System.out.println(对象[0]+“|”+对象[1]);
}

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

是否可以使用hibernate的标准而不是jpa标准生成器来执行此操作?
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]);
}
select MAX(id),max(value) from ABCD where id in (110,56001) group by id