JPA getSingleResult()或null

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (26)

我有一个insertOrUpdate方法,Entity当它不存在时插入一个或更新它。为了实现这一点,我必须findByIdAndForeignKey,如果它返回null插入,如果没有,然后更新。问题是如何检查它是否存在?所以我尝试了getSingleResult。但它会抛出一个异常,如果

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;
}

getSingleResult抛出一个Exception

提问于
用户回答回答于

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

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

用户回答回答于

我将逻辑封装在下面的方法中。

public class JpaResultHelper {
    public static Object getSingleResultOrNull(Query query){
        List results = query.getResultList();
        if (results.isEmpty()) return null;
        else if (results.size() == 1) return results.get(0);
        throw new NonUniqueResultException();
    }
}

扫码关注云+社区