【问题标题】:checking null return from database using getSingleResult of entity manager使用实体管理器的 getSingleResult 检查数据库的空返回
【发布时间】:2013-04-10 08:20:23
【问题描述】:

我必须检索数据库条目。我知道我写的查询只返回一行。因此,我正在使用 getSingleResult。但是,当查询返回 null 时,我无法捕捉到它。我该如何解决这个问题? 这是我的一段代码

       try {
            result = em.createQuery("SELECT d FROM fields d WHERE d.fieldID = :fieldID", Field.class)
                       .setParameter("fieldID", fieldID)
                       .getSingleResult();

//manual null check only seems to work. But it seems tedious to check every DB column for null value :(

       if((result.getValsText() == null)){
                result = new Field();
                result.setValText("empty");

            }
        } catch (NoResultException e) {
            result = new Field();
            result.setValText("empty");

        }

请指教。

谢谢

【问题讨论】:

    标签: database jakarta-ee entitymanager


    【解决方案1】:

    对于非 Id 属性,您可以

    • 在常规查询之前发送COUNT 查询或更好
    • 在您的Query 上致电getResultList()

    getResultList 如果没有找到结果,将返回一个空列表。要获得您的单一结果,请检查列表是否为空并在其上调用get(0)

    如果属性是@Id 属性,则调用entityManager.find(MyEntity.class, id); - 如果未找到结果,则find 返回null,如果已找到您的实体的单个实例。

    EDIT-出于性能和可读性的原因,最后一个选项更可取。在不能使用最后一个的地方使用第二个选项(列表)。

    【讨论】:

    • 我似乎得到一个空 bcos 没有找到记录。我想这就是为什么没有抛出 NoResultException 的原因?那么如何使用 getSingleResult 来检查呢?
    • @user900785 - 好吧,这就是重点 - 无法单独使用 getSingleResult 进行检查 - try/catch 是您唯一可以使用它做的事情,所以只能在您确定的情况下使用它找到结果。对于没有发现任何错误不被视为错误的查询,您可以使用我的答案中的 3 个选项之一(最好使用第三个选项)
    • 我有一个不同的问题。我尝试了您的建议,那是当我意识到某些列条目为 NULL 时。因此我得到一个空指针异常。我该如何检查?
    • @user900785 我不确定我是否理解 - 哪个选项的确切调用会导致 NPE?请将相关代码添加到您的问题中。
    猜你喜欢
    • 2014-05-02
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 2014-11-01
    • 1970-01-01
    相关资源
    最近更新 更多