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

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

我尝试使用Projections ,为max(colunName) 创建一个别名 ,然后在max(colunName)使用它,但它一直告诉我“ 无效数字 ”。

使用Hibernate的正确方法是什么?

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

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

参考

  • Hibernate核心参考指南
    • 15.8。 分离的查询和子查询

我发现使用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以外的方言是否有效。

使用

 addOrder(Order.desc("id")) 

并获取第一个结果:)

HQL:

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

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

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

更清洁的解决方案还将是:

 DetachedCriteria criteria = DetachedCriteria.forClass(Foo.class).setProjection(Projections.max("id")); Foo fooObj =(Foo) criteria.getExecutableCriteria(getCurrentSession()).list().get(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 list = criteria.list(); if(!CollectionUtils.isEmpty(list)){ maxDateFromDB = list.get(0); } 

完全使用分离标准(因为我喜欢构建没有会话的分离标准)

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

对于hibernate中的max()函数:

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