使用Hibernate Criteria获取具有最大ID的记录

时间:2010-10-10 11:25:12

标签: java hibernate criteria

使用HibernateCriteria API,我想在表格中选择具有给定列的最大值的记录。

我尝试对max(colunName)使用Projectionscreating an alias,然后在restrictions.eq()中使用它,但它一直告诉我“无效数字

使用Hibernate做到这一点的正确方法是什么?

8 个答案:

答案 0 :(得分:36)

您可以使用DetachedCriteria来表达子查询,如下所示:

DetachedCriteria maxId = DetachedCriteria.forClass(Foo.class)
    .setProjection( Projections.max("id") );
session.createCriteria(Foo.class)
    .add( Property.forName("id").eq(maxId) )
    .list();

参考

答案 1 :(得分:22)

我发现使用addOrdersetMaxResults一起为我工作。

Criteria c = session.createCriteria(Thingy.class);
c.addOrder(Order.desc("id"));
c.setMaxResults(1);
return (Thingy)c.uniqueResult();

使用MySQL方言,这会生成一个类似于此的SQL预处理语句(剪掉一些字段):

select this_.id ... from Thingy this_ order by this_.id desc limit ?

我不确定这个解决方案对MySQL以外的方言是否有效。

答案 2 :(得分:6)

使用

addOrder(Order.desc("id"))

并获取第一个结果:)

答案 3 :(得分:1)

HQL:

from Person where person.id = (select max(id) from Person)

未测试。您的数据库需要了解where子句中的子选择。

太懒了,无法确定是否/如何用标准api表达这样的子选择。当然,您可以执行两个查询:首先获取最大ID,然后获取具有该ID的实体。

答案 4 :(得分:0)

清洁解决方案也将是:

DetachedCriteria criteria = DetachedCriteria.forClass(Foo.class).setProjection(Projections.max("id"));
Foo fooObj =(Foo) criteria.getExecutableCriteria(getCurrentSession()).list().get(0);

答案 5 :(得分:0)

    Date maxDateFromDB = null;
    Session session = (Session) entityManager.getDelegate();
//Register is and Entity and assume maxDateFromDB is a column.
//Status is another entity with Enum Applied.
//Code is the Parameter for One to One Relation between Register and Profile entity.
    Criteria criteria = session.createCriteria(Register.class).setProjection(Projections.max("maxDateFromDB") )
    .add(Restrictions.eq("status.id", Status.Name.APPLIED.instance().getId()));
    if(code != null && code > 0) {
        criteria.add(Restrictions.eq("profile.id", code));
    }
    List<Date> list = criteria.list();

    if(!CollectionUtils.isEmpty(list)){
        maxDateFromDB = list.get(0);
    }

答案 6 :(得分:0)

完全使用Detached Criteria(因为我喜欢在没有会话的情况下构建分离的条件)

DetachedCriteria maxQuery = DetachedCriteria.forClass(Foo.class)
    .setProjection( Projections.max("id") );
DetachedCriteria recordQuery = DetachedCriteria.forClass(Foo.class)
    .add(Property.forName("id").eq(maxId) );

答案 7 :(得分:-2)

对于hibernate中的max()函数:

criteria.setProjection(Projections.max("e.encounterId"));