我有一个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
。
谢谢
发布于 2010-01-05 07:19:13
抛出异常是getSingleResult()
指示找不到它的方式。就我个人而言,我不能忍受这种API。它强制进行虚假的异常处理,但没有真正的好处。您只需将代码包装在try-catch块中。
或者,您也可以查询一个列表,看看它是否为空。这不会抛出异常。实际上,由于从技术上讲,您不是在执行主键查找,因此可能会有多个结果(即使只有一个、两个,或者外键或约束的组合在实践中不可能实现这一点),所以这可能是更合适的解决方案。
发布于 2010-05-22 03:33:51
我将逻辑封装在下面的助手方法中。
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();
}
}
发布于 2016-12-31 13:49:23
在Java 8中尝试一下:
Optional first = query.getResultList().stream().findFirst();
https://stackoverflow.com/questions/2002993
复制相似问题