Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中使用Hibernate的DetachedCriteria限制结果的最佳方法是什么?_Java_Hibernate_Orm_Detachedcriteria - Fatal编程技术网

在Java中使用Hibernate的DetachedCriteria限制结果的最佳方法是什么?

在Java中使用Hibernate的DetachedCriteria限制结果的最佳方法是什么?,java,hibernate,orm,detachedcriteria,Java,Hibernate,Orm,Detachedcriteria,我在Java中使用Hibernate 3.5.6-Final。因为我没有访问Hibernate的权限,所以我使用了一个。因此,我想知道限制分离标准结果的最佳方法是什么(在我的情况下,我只想得到第一行) 其他信息: 该类有一些方法可以实现这一点,如或,但DetachedCriteria两者都没有。同样,我不能使用标准,因为我没有访问Hibernate会话的权限。如果我正确地阅读了javadoc,则在最终将DetachedCriteria转换为真实标准之前,您不能进行限制(当您有会话时)您可以使用添

我在Java中使用Hibernate 3.5.6-Final。因为我没有访问Hibernate的权限,所以我使用了一个。因此,我想知道限制分离标准结果的最佳方法是什么(在我的情况下,我只想得到第一行)

其他信息:


该类有一些方法可以实现这一点,如或,但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);