3

我在 Java 中使用 Hibernate 3.5.6-Final。由于我无权访问 Hibernate Session,因此我使用的是DetachedCriteria。所以,我想知道限制 DetachedCriteria 结果的最佳方法是什么(在我的情况下,我只想获得第一行)。

附加信息:

Criteria类有一些方法可以实现这一点,例如setMaxResults (int maxResults)setFirstResult(int firstResult),但 DetachedCriteria 两者都没有。同样,我不能使用 Criteria,因为我无权访问 Hibernate 的会话。

4

6 回答 6

10

我就是这样做的,您必须将结果包装到执行块中。下面示例中的 EntityMAnager 是org.springframework.orm.hibernate3.HibernateOperationsobject :

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;
于 2012-10-27T06:54:36.167 回答
6

您可以使用Restrictions.sqlRestriction()将纯 SQL 表达式添加到 DetachedCriteria。尝试这个:

DetachedCriteria criteria = DetachedCriteria.forClass(Domain.class)
  .add(Restrictions.sqlRestriction("LIMIT 1"));
于 2012-07-17T01:25:55.370 回答
4

如果您使用的是休眠模板,则有一个findByCriteria(criteria, firstResult, maxResults). 不鼓励使用模板,但对于那些使用遗留代码的人来说,这是可用的。

于 2016-03-23T15:35:27.860 回答
2

如果我正确地阅读了 javadoc,那么在您最终将 DetachedCriteria 转换为真正的 Criteria 之前,您无法限制(当您确实有会话时)

于 2012-07-16T15:52:04.730 回答
1

扩展 yorkw 的答案,Oracle 等价物是:

DetachedCriteria criteria = DetachedCriteria.forClass(Domain.class)
  .add(Restrictions.sqlRestriction("rownum < 1"));

它将行限制添加到子查询中的“where”子句。

于 2015-04-23T22:28:36.460 回答
-1
detachedCriteria.getExecutableCriteria(getSession()).setMaxResults(1);
于 2017-07-29T15:57:49.390 回答