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()是更好的方法吗?我知道它在代码可理解性方面更好,但抛出异常会使它变得不受欢迎(不需要以我的方式处理异常)。除了代码可理解性之外,还有其他好处吗?你好,谢尔盖,非常感谢你的跟进!对我最初问题的一个有益的结论。干杯