首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JPA getSingleResult()或null

JPA getSingleResult()或null
EN

Stack Overflow用户
提问于 2010-01-05 07:15:24
回答 19查看 235.8K关注 0票数 146

我有一个insertOrUpdate方法,它在Entity不存在时插入它,或者在它存在时更新它。要启用此功能,我必须执行findByIdAndForeignKey,如果返回null,则插入,如果没有,则执行更新。问题是我如何检查它是否存在?所以我尝试了getSingleResult。但它会抛出异常

代码语言:javascript
复制
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

谢谢

EN

回答 19

Stack Overflow用户

回答已采纳

发布于 2010-01-05 07:19:13

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

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

票数 281
EN

Stack Overflow用户

发布于 2010-05-22 03:33:51

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

代码语言:javascript
复制
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();
    }
}
票数 35
EN

Stack Overflow用户

发布于 2016-12-31 13:49:23

在Java 8中尝试一下:

代码语言:javascript
复制
Optional first = query.getResultList().stream().findFirst();
票数 35
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2002993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档