在Java中使用Hibernate的DetachedCriteria限制结果的最佳方法是什么?
我在Java中使用Hibernate 3.5.6-Final。因为我没有访问Hibernate的权限,所以我使用了一个。因此,我想知道限制分离标准结果的最佳方法是什么(在我的情况下,我只想得到第一行) 其他信息:在Java中使用Hibernate的DetachedCriteria限制结果的最佳方法是什么?,java,hibernate,orm,detachedcriteria,Java,Hibernate,Orm,Detachedcriteria,我在Java中使用Hibernate 3.5.6-Final。因为我没有访问Hibernate的权限,所以我使用了一个。因此,我想知道限制分离标准结果的最佳方法是什么(在我的情况下,我只想得到第一行) 其他信息: 该类有一些方法可以实现这一点,如或,但DetachedCriteria两者都没有。同样,我不能使用标准,因为我没有访问Hibernate会话的权限。如果我正确地阅读了javadoc,则在最终将DetachedCriteria转换为真实标准之前,您不能进行限制(当您有会话时)您可以使用添
该类有一些方法可以实现这一点,如或,但DetachedCriteria两者都没有。同样,我不能使用标准,因为我没有访问Hibernate会话的权限。如果我正确地阅读了javadoc,则在最终将DetachedCriteria转换为真实标准之前,您不能进行限制(当您有会话时)您可以使用添加普通SQL表达式到DetachedCriteria。试试这个:
DetachedCriteria criteria = DetachedCriteria.forClass(Domain.class)
.add(Restrictions.sqlRestriction("LIMIT 1"));
我就是这样做的,您必须将结果包装到执行块中。 下面示例中的EntityMAnager是
org.springframework.orm.hibernate3.HibernateOperations
对象:
final DetachedCriteria criteria = DetachedCriteria.forClass(ActivePropertyView.class);
criteria.add(Restrictions.eq("featured", true));
List<ActivePropertyView> result = entityManager.execute(
new HibernateCallback<List<ActivePropertyView>>() {
@Override
public List<ActivePropertyView> doInHibernate(Session session)
throws HibernateException,SQLException {
return criteria.getExecutableCriteria(session).setMaxResults(5).list();
}
});
return result;
final-DetachedCriteria-criteria=DetachedCriteria.forClass(ActivePropertyView.class);
标准。添加(限制。情商(“特色”,真实));
列表结果=entityManager.execute(
新的HibernateCallback(){
@凌驾
公共列表doInHibernate(会话)
抛出HibernateeException、SQLException{
返回条件.getExecutableCriteria(session).setMaxResults(5.list();
}
});
返回结果;
扩展约克的答案,Oracle的等价物是:
DetachedCriteria criteria = DetachedCriteria.forClass(Domain.class)
.add(Restrictions.sqlRestriction("rownum < 1"));
DetachedCriteria=DetachedCriteria.forClass(Domain.class)
.add(Restrictions.sqlRestriction(“rownum<1”));
它会将行限制添加到子查询中的“where”子句中。如果您使用的是hibernate模板,则有一个
findByCriteria(criteria、firstResult、maxResults)
。不鼓励使用模板,但对于那些使用遗留代码的模板,这是可用的。这种方法似乎是最好的,因为DetachedCriteria
将始终到达Hibernate会话所在的存储库层。谢谢只有当它只有一个对象时,它才能正常工作。如果此分离对象具有关联,而该关联具有多个记录,该怎么办。这个MaxResults(1)得到的是唯一关联的对象,即使它有更多的结果。感谢修改我的阻塞点,但我仍然想知道如何做。@iririr给出的答案似乎是目前处理此场景的最佳方法。为什么不使用您自己的ExtendedDetachedCriteriaClass来扩展条件并添加限制和偏移量呢。然后在您实际拥有会话时设置它们。这在mysql中不起作用。我注意到“limit 1”在WHERE子句中显示为条件,这不是一个有效的sql语句。解决方法是放置DetachedCriteria criteria=DetachedCriteria.forClass(Domain.class).add(Restrictions.sqlRestriction(“1=1 limit 1”)
至少PostgreSQL要求LIMIT
语句在物理上落后于ORDER BY
。这种方法将其插入到WHERE
和ORDER BY
之间(如果您指定了)。但若你们并没有对结果进行排序,你们怎么能得到一致的结果呢?最好的答案是everNice解决方案+1.
detachedCriteria.getExecutableCriteria(getSession()).setMaxResults(1);