有人可以告诉我为什么在 JPA 1.0 EntityManager 中通过 find 检索对象时,如果找不到则必须处理 null 的内在原因,但是当通过 createQuery getResultList 使用 Query 接口时,找不到时会抛出 NoResultException 。
也许我遗漏了一些东西,但我觉得它对于一种语言非常不一致,实际上我不得不做很多重新设计,因为使用查询界面从简单的查找器更改为更细粒度的查询。
多谢你们。
有人可以告诉我为什么在 JPA 1.0 EntityManager 中通过 find 检索对象时,如果找不到则必须处理 null 的内在原因,但是当通过 createQuery getResultList 使用 Query 接口时,找不到时会抛出 NoResultException 。
也许我遗漏了一些东西,但我觉得它对于一种语言非常不一致,实际上我不得不做很多重新设计,因为使用查询界面从简单的查找器更改为更细粒度的查询。
多谢你们。
查询可用于检索几乎任何内容,包括单行中单列的值。
如果getSingleResult()
将返回 null,则您无法判断查询是否与任何行不匹配,或者查询是否匹配行但所选列包含 null 作为其值。
当您进行查找时,jpa 将使用主键来定位实体对象,通常使用二级缓存,它通常比 createQuery 和 getSingleResult 快得多。
您要么从 find 中获取 null 或 Object。当您执行 createQuery 并创建 Query 对象的实例时。如果您执行 getResultList 它不会抛出 NoResultException,只有当您执行 getSingleResult 时才会抛出该异常。如果您执行 getResultList 但没有找到,则将返回 null。
此外,NoResultException 将在 weblogic 10.3.2 中标记事务回滚。
请参阅本文:NoResultException 标记事务回滚
我认为它消除了这个空检查:
Object o = q.getSingleResult();
if (o != null)
return (MyObj) o;
return o;
通过引入 RuntimeException (NoResultException) ,程序员可以安全地将 q.getSingleResult() 转换为 MyObj ,并将异常留给调用者。
至于 q.getResultList() ,它总是会返回一个 list ,不需要空检查。
但我仍然觉得这不直观。