为什么JPA使用javax.persistence.NoResultException

dev*_*ull 6 java jpa java-ee

是不是javax.persistence.NoResultException违反了Java中异常使用的基本原则?

不应使用例外来控制程序的正常流程.从数据库查询返回零结果似乎是非常标准(非常例)的情况.无论如何都将通过调用代码来处理.

mab*_*abi 22

请注意,NoResultExceptionjavadoc指出:

在查询上执行Query.getSingleResult()或TypedQuery.getSingleResult()并且没有返回结果时由持久性提供程序抛出.

利用getSingleResult()你说明你知道那里将是正好一个结果.不多(见NonUniqueResultException),而不是更少.因此,我认为缺少结果确实是一种特殊情况.

如果您不确定将返回的数据量,请使用getResultList().

但是,对于JPA API的这一部分,您并不孤单.这篇文章指出唯一真正有效的用途getSingleResult()是返回一个标量值,指出这NoResultException是一个未经检查的异常并引用了Bloch的Effective Java,第40项:

对可恢复条件使用已检查的异常,对编程错误使用运行时异常.

不幸的是,JPA 2.0规范(或任何其他规范)并没有解释这种选择背后的原因.

  • @mabi`所以我认为缺少结果确实是一种特殊的情况.这是恕我直言的原始问题. (2认同)