为什么在JPA EntityManager查询中抛出NoResultException但是find却没有?

时间:2009-10-16 18:12:56

标签: jpa entitymanager

有人可以告诉我JPA 1.0 EntityManager在通过find检索对象时的内在原因,如果找不到则必须处理null,但是当通过createQuery使用Query接口时,getResultList会在找不到时抛出NoResultException。 / p>

也许我错过了一些东西,但我觉得它与语言非常不一致,实际上我不得不做很多的重新设计,因为使用查询界面从简单的查找器更改为更细粒度的查询。

谢谢你们。

4 个答案:

答案 0 :(得分:23)

查询可用于检索几乎任何内容,包括单行中单个列的值。

如果getSingleResult()将返回null,则无法判断查询是否与任何行匹配,或者查询是否与行匹配,但所选列包含null作为其值。

答案 1 :(得分:8)

当你进行查找时,jpa将使用主键来定位实体对象,通常使用二级缓存,它通常比createQuery和getSingleResult快得多。

您可以从find中获取null或Object。当您执行createQuery时,将创建Query对象的实例。如果你执行一个getResultList,它将不会抛出NoResultException,只有当你执行getSingleResult才会抛出该异常。如果你执行getResultList并且找不到,则返回null。

答案 2 :(得分:2)

此外,NoResultException将在weblogic 10.3.2中标记事务回滚。

请参阅此文章:NoResultException marks transaction rollback

答案 3 :(得分:-1)

我认为它消除了这种空检查:

Object o = q.getSingleResult();
if (o != null)
  return (MyObj) o;
return o;

通过引入RuntimeException(NoResultException),程序员可以安全地将q.getSingleResult()强制转换为MyObj,并将异常保留给调用者。

对于q.getResultList(),它总是返回一个列表,不需要进行null-check。

但我仍觉得这不直观。