在 getSingleResult 聚合中处理 null 的正确方法

Posted

技术标签:

【中文标题】在 getSingleResult 聚合中处理 null 的正确方法【英文标题】:Proper way to to handle null in getSingleResult aggregate 【发布时间】:2021-04-23 09:40:09 【问题描述】:

是否有任何适当的方法来处理空值,例如用户表中没有现有记录,所以它不会抛出空指针:

【问题讨论】:

.getSingleResult() 应该只用于保证 single 结果的查询。不是多个结果,不是空结果,而是单个。完美示例 - 计数查询 (select count(...)),它们从不返回 null 或多个结果 但是 (Select MAX) 返回 null。 【参考方案1】:

如果数据库中不存在该记录,请不要使用getSingleResult()。查看javadoc,您需要确保记录存在才能使用getSingleResult()

getSingleResult

java.lang.Object getSingleResult()

执行一个返回单个无类型结果的 SELECT 查询。

返回: 结果

投掷

NoResultException - 如果没有结果

NonUniqueResultException - 如果有多个结果

改为使用getResultList()

public long generateNextId() 
    Query query = getEntityManager().createQuery("SELECT MAX(id)+1 from Users");
    List<Object> objs = query.getResultList();
    return objs.isEmpty() ? 1 : Long.parseLong(objs.get(0));

此外,如果我是你,我会使用 TypedQuery&lt;Long&gt;

public long generateNextId() 
    TypedQuery<Long> query = getEntityManager().createQuery("SELECT MAX(id)+1 from Users", Long.class);
    List<Long> objs = query.getResultList();
    return objs.isEmpty() ? 1 : objs.get(0);


如果,如 this question 中所述,查询可以返回 null,那么您可以使用 null 检查或使用 Optional#ofNullable 包装器

【讨论】:

似乎 query.getResultList() 的返回大小为 1,即使查询中没有结果。 可以打印列表的内容吗? 它有点奇怪,因为它没有循环。但arraysize = 1。可能是因为 SELECT MAX 聚合? 可能是因为+1 我试图删除。但它是一样的..这就是为什么它很奇怪。我认为 MAX 真的返回 null。

以上是关于在 getSingleResult 聚合中处理 null 的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

getSingleResult() 改变 count() 查询

JPA 中的 getSingleResult() 抛出异常

JPA getSingleResult() 或 null

getSingleResult 和 selectone

通过基本函数在较少的大数组中聚合许多小数组

Logstash:使用 aggregation filter 把事件流聚合为一个事件