Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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
JPA:获取有序对象列表中第一个对象的更好方法是什么?_Jpa - Fatal编程技术网

JPA:获取有序对象列表中第一个对象的更好方法是什么?

JPA:获取有序对象列表中第一个对象的更好方法是什么?,jpa,Jpa,我需要检索最近更新的对象。目前,我可以通过执行以下类似操作来检索它: em.createQuery("select m from MyObject m order by m.updateTime").setFirstResult(0).setMaxResults(1).getResultList() 然后,如果结果列表不为空,则获取唯一的对象。我很好奇是否有更好的方法来做这类事情 谢谢和问候 在这种情况下,将第一个结果设置为0是多余的,如果您只需要一行,则可以使用函数 因此,您的代码可以修改如

我需要检索最近更新的对象。目前,我可以通过执行以下类似操作来检索它:

em.createQuery("select m from MyObject m order by m.updateTime").setFirstResult(0).setMaxResults(1).getResultList()
然后,如果结果列表不为空,则获取唯一的对象。我很好奇是否有更好的方法来做这类事情


谢谢和问候

在这种情况下,将第一个结果设置为
0
是多余的,如果您只需要一行,则可以使用函数

因此,您的代码可以修改如下:

MyObject myObject = em.createQuery("select m from MyObject m order by m.updateTime").setMaxResults(1).getSingleResult();
编辑:正如Tiny在案例中提到的,当没有匹配行时,代码将抛出一个要处理的
NoResultException
(例如,在这种情况下分配一个
null
值)

EDIT2: 我检查了这两种方法的Hibernate实现,结果发现
getSingleResult()
包含了
getResultList()
所包含的所有代码,除此之外还有以下代码块:

    if ( result.size() == 0 ) {
        NoResultException nre = new NoResultException( "No entity found for query" );
        getEntityManager().handlePersistenceException( nre );
        throw nre;
    }
    else if ( result.size() > 1 ) {
        final Set<X> uniqueResult = new HashSet<X>(result);
        if ( uniqueResult.size() > 1 ) {
            NonUniqueResultException nure = new NonUniqueResultException( "result returns more than one elements" );
            getEntityManager().handlePersistenceException( nure );
            throw nure;
        }
        else {
            return uniqueResult.iterator().next();
        }
    }
    else {
        return result.get( 0 );
    }
if(result.size()==0){
NoResultException nre=新的NoResultException(“未找到查询实体”);
getEntityManager().handlePersistenceException(nre);
投掷nre;
}
else if(result.size()>1){
最终集uniqueResult=新哈希集(结果);
如果(uniqueResult.size()>1){
ununiqueresultexception nure=新的ununiqueresultexception(“结果返回多个元素”);
getEntityManager().handlePersistenceException(nure);
掷骰子;
}
否则{
返回uniqueResult.iterator().next();
}
}
否则{
返回结果get(0);
}
因此,当使用
getSingleResult()
时,实现速度会变慢


EDIT3
getSingleResult()
如果结果行为零或多个是无效/异常数据状态(即,如果发生这种情况,则您知道您的数据已损坏),则将非常有用。由于
NoResultException
ununiquersultexception
都是未修补的异常,因此您将只得到一行代码(如果
,则不需要
捕获

getSingleResult()
仅当结果列表仅包含一行时成功。否则,如果结果列表包含多行或根本不获取行,则会引发异常。因此,需要考虑它。这里考虑它
setMaxResults(1)
Yes,但是如果结果列表不包含行(例如,表本身为空),它将抛出
NoResultException
。Sergey和Tiny,非常感谢您的输入。一个简短的问题。getSingleResult()是更好的方法吗?我知道它在代码可理解性方面更好,但抛出异常会使它变得不受欢迎(不需要以我的方式处理异常)。除了代码可理解性之外,还有其他好处吗?你好,谢尔盖,非常感谢你的跟进!对我最初问题的一个有益的结论。干杯