使用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。 分离的查询和子查询
我发现使用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以外的方言是否有效。
使用
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"));
- 事务性保存而不调用更新方法
- BCrypt.checkpw()无效的盐版本exception
- 无法通过reflectionhibernate获取字段值
- 是否可以使用Hibernate或JPA Annotations限制@OneToMany集合的大小?
- jpa独立自定义类型映射/ javax.persistence.x替代org.hibernate.annotations.Type和org.hibernate.annotations.TypeDef
- 如何在hibernate上指定Double的精度?
- 为什么@OneToMany在Hibernate中不能inheritance
- Wicket:如何处理长时间运行的任务
- 如何使用hibernate生成Custom Id,同时它必须是表的主键