16

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

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

多谢你们。

4

4 回答 4

26

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

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

于 2012-08-28T08:58:56.727 回答
9

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

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

于 2009-10-18T19:33:44.067 回答
2

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

请参阅本文:NoResultException 标记事务回滚

于 2011-02-17T18:33:11.440 回答
-1

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

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

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

至于 q.getResultList() ,它总是会返回一个 list ,不需要空检查。

但我仍然觉得这不直观。

于 2011-03-10T21:08:02.860 回答