问题
我有一个insertOrUpdate
方法,当它不存在时插入一个Entity
或者如果它存在则更新它。要启用它,我必须到findByIdAndForeignKey
,如果它返回null
insert,如果没有那么更新。问题是如何检查它是否存在?所以我尝试了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);
}