JPA getSingleResult() or null

2022-08-31 07:34:44

我有一个方法,当它不存在时插入,或者如果它存在,则更新它。要启用此功能,我必须,如果它返回插入,如果没有,则更新。问题是我如何检查它是否存在?所以我试过了.但它会引发异常,如果insertOrUpdateEntityfindByIdAndForeignKeynullgetSingleResult

public Profile findByUserNameAndPropertyName(String userName, String propertyName) {
    String namedQuery = Profile.class.getSimpleName() + ".findByUserNameAndPropertyName";
    Query query = entityManager.createNamedQuery(namedQuery);
    query.setParameter("name", userName);
    query.setParameter("propName", propertyName);
    Object result = query.getSingleResult();
    if (result == null) return null;
    return (Profile) result;
}

但抛出一个 .getSingleResultException

谢谢


答案 1

抛出异常是 getSingleResult() 表示找不到它的方式。就我个人而言,我无法忍受这种API。它强制进行虚假的异常处理,但没有真正的好处。您只需要将代码包装在 try-catch 块中即可。

或者,您可以查询列表并查看其是否为空。这不会引发异常。实际上,由于您在技术上没有进行主键查找,因此可能会有多个结果(即使一个,两个或外键或约束的组合在实践中使这是不可能的),因此这可能是更合适的解决方案。


答案 2

在 Java 8 中尝试此操作:

Optional first = query.getResultList().stream().findFirst();

推荐