问题

我有一个insertOrUpdate方法,当它不存在时插入一个Entity或者如果它存在则更新它。要启用它,我必须到findByIdAndForeignKey,如果它返回nullinsert,如果没有那么更新。问题是如何检查它是否存在?所以我尝试了5773777097。但是如果它会引发异常

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发表了aException

谢谢


#1 热门回答(218 赞)

抛出异常是howgetSingleResult()表示无法找到它。我个人无法忍受这种API。它强制虚假的异常处理没有真正的好处。你只需将代码包装在try-catch块中即可。

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


#2 热门回答(28 赞)

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

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

#3 热门回答(19 赞)

这是一个很好的选择:

public static <T> T getSingleResult(TypedQuery<T> query) {
    query.setMaxResults(1);
    List<T> list = query.getResultList();
    if (list == null || list.isEmpty()) {
        return null;
    }

    return list.get(0);
}

原文链接