使用Hibernate的Criteria API,我想在表格中选择具有给定列的最大值的记录。
我尝试对max(colunName)
使用Projections,creating an alias,然后在restrictions.eq()
中使用它,但它一直告诉我“无效数字 ”
使用Hibernate做到这一点的正确方法是什么?
答案 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)
我发现使用addOrder
和setMaxResults
一起为我工作。
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"));