在 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<Long>
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 的正确方法的主要内容,如果未能解决你的问题,请参考以下文章