有人可以告诉我JPA 1.0 EntityManager在通过find检索对象时的内在原因,如果找不到则必须处理null,但是当通过createQuery使用Query接口时,getResultList会在找不到时抛出NoResultException。 / p>
也许我错过了一些东西,但我觉得它与语言非常不一致,实际上我不得不做很多的重新设计,因为使用查询界面从简单的查找器更改为更细粒度的查询。
谢谢你们。
答案 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中标记事务回滚。
答案 3 :(得分:-1)
我认为它消除了这种空检查:
Object o = q.getSingleResult();
if (o != null)
return (MyObj) o;
return o;
通过引入RuntimeException(NoResultException),程序员可以安全地将q.getSingleResult()强制转换为MyObj,并将异常保留给调用者。
对于q.getResultList(),它总是返回一个列表,不需要进行null-check。
但我仍觉得这不直观。