为什么在JPA EntityManager查询中抛出NoResultException但却找不到?

16 jpa entitymanager

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

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

多谢你们.

小智 23

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

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


She*_*ari 8

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

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

  • 多数民众赞成是的.我仍然不太清楚为什么JPA规范人员在一个案例中决定抛出一个noresultexception而在另一个案例中只返回null,如果它在逻辑上非常相似的操作.它是一个未经检查的异常并不会让它变得更容易......或者转过身:什么反对从getSingleResult返回null而不是抛出异常?在我看来,这将更加一致:在getSingleResult中抛出NoREsultExcpetion并找到或返回null.但不能混合它. (4认同)