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

Amr*_*sal 30 java hibernate criteria

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

我试图用投影,创造一个别名max(colunName),然后使用它restrictions.eq(),但它不断告诉我" 无效号码 ".

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

Pas*_*ent 36

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

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

参考


ama*_*eod 22

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

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

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

select this_.id ... from Thingy this_ order by this_.id desc limit ?
Run Code Online (Sandbox Code Playgroud)

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

  • 它应该谨慎使用,因为``order by`和`limit`通常[较慢](http://stackoverflow.com/a/426785/1251549)然后是`max` /`min` sql语句. (2认同)

Why*_*ugo 6

使用

addOrder(Order.desc("id"))
Run Code Online (Sandbox Code Playgroud)

并获取第一个结果:)

  • 不,我说取第一个,这将是"SELECT ... LIMIT 1"之类的东西(抱歉,现在很久没有使用过hibernate).你所说的是取几个,而只是使用第一个; 他们是不同的东西. (4认同)
  • 这很糟糕,因为您将整个列表从数据库中删除,然后您丢弃所有其他记录.如果你有一张巨大的桌子,那就不会很好! (2认同)