![](/img/trans.png)
[英]org.hibernate.NonUniqueResultException: query did not return a unique result: 462
[英]org.hibernate.NonUniqueResultException: query did not return a unique result: 2?
我的 DAO 中有以下代码:
String sql = "SELECT COUNT(*) FROM CustomerData " +
"WHERE custId = :custId AND deptId = :deptId";
Query query = session.createQuery(sql);
query.setParameter("custId", custId);
query.setParameter("deptId", deptId);
long count = (long) query.uniqueResult(); // ERROR THROWN HERE
Hibernate 在标记行抛出以下异常:
org.hibernate.NonUniqueResultException:查询未返回唯一结果:
我不确定发生了什么,因为count(*)
总是只返回一行。
此外,当我直接在 db 上运行此查询时,它返回结果为 1。那么问题是什么?
似乎您的查询返回多个结果检查数据库。 在query.uniqueResult()
文档中,您可以阅读:
抛出: org.hibernate.NonUniqueResultException - 如果有多个匹配结果
如果你想避免这个错误并且仍然使用唯一结果请求,你可以使用这种解决方法query.setMaxResults(1).uniqueResult();
Hibernate 可选 findTopByClientIdAndStatusOrderByCreateTimeDesc(Integer clientId, Integer status);
“找顶”!! 结果只有一个!
我认为其他答案没有解释关键部分:为什么“COUNT(*)”返回多个结果?
我今天刚遇到同样的问题,我发现如果你有另一个类扩展目标映射类(这里是“CustomerData”),Hibernate 会做这个魔术。
希望这会为其他不幸的人节省一些时间。
通常,当查询结果(在您的情况下存储在对象中)无法转换为所需的对象时,Oracle 会抛出此异常。 例如,当结果是
List<T>
并且您将结果放入单个 T 对象中。
在强制转换为长错误的情况下,除了建议使用包装器类以使所有列的行为都相同之外,我猜事务或查询本身的问题会导致此问题。
这意味着您编写的查询返回多个元素(结果),而您的代码需要一个结果。
基本上,您的查询返回多个结果集。 在 API Docs 中的 uniqueResult() 方法表示Convenience 方法返回与查询匹配的单个实例,如果查询没有返回结果,则返回 null
uniqueResult()方法只产生单个结果集
在未完成的事务期间是否会抛出此异常,其中您的应用程序试图创建一个实体,该实体具有与您用来尝试查找单个实体的标识符的重复字段?
在这种情况下,新的(重复的)实体在数据库中将不可见,因为事务没有,并且永远不会提交到数据库。 但是,仍然会抛出异常。
认为这可能对某人有所帮助,但发生这种情况是因为“当数据查询的数量大于 1 时”。 参考
在执行其他正确的休眠查询时收到此错误。 问题是,当让一个类扩展另一个休眠时,两者都计算在内。 可以通过向存储库类添加方法来“修复”此错误。
通过覆盖类计数,您可以手动确定计数方式。
@Override
public Integer count(Page<MyObject> page) {
// manual counting method here
}
正如@Grox13 在此处回答的那样,在此处输入链接描述
或者,如果您使用Optional<>
将其更改为List<>
正如 Ian Wang 所说,我怀疑您正在使用 spring 的存储库。 几天前,您只是复制了一个类,但在最终未使用时忘记删除它。 检查该存储库,看看是否有多个您使用的相同类的表。 计数不是行数,而是表问题的计数。
我正在使用 JPQL 并想返回Map
。 就我而言,原因是我想得到Map<String, String>
,但不得不期待List<Map<String, String>>
:)
这意味着 orm 技术没有预先编程来为您提供您正在寻找的结果,因为数据库中有太多相同的结果。 例如,如果我的数据库中有多个相同的值并且我想取回它,您将遇到选择查询时遇到的错误。
检查您的表,其中一个实体多次出现。
我有同样的错误,这个数据:
ID | 数量 | 客户编号 | 创建日期 | 到期日期 |
---|---|---|---|---|
428 | 100 | 427 | 19/11/2021 | 19/12/2021 |
464 | 100 | 459 | 22/11/2021 | 22/12/2021 |
464 | 100 | 459 | 22/11/2021 | 22/12/2021 |
您在这里看到clientid
出现了两次。
我通过删除一行来解决它,以完成这个:
ID | 数量 | 客户编号 | 创建日期 | 到期日期 |
---|---|---|---|---|
428 | 100 | 427 | 19/11/2021 | 19/12/2021 |
464 | 100 | 459 | 22/11/2021 | 22/12/2021 |
我找到了问题的核心:
SELECT COUNT(*) 的结果可以是一个列表,如果查询中有一个 GROUP BY,
有时 Hibernate 会重写您的 HQL 并将一个 GROUP BY 放入其中,只是为了好玩。
对我来说,错误是由spring.jpa.hibernate.ddl-auto=update
在 application.properties 文件中替换为spring.jpa.hibernate.ddl-auto=create
-auto=update 引起的在您的项目中,有关该主题的更多见解,请查看此。
首先你必须测试查询列表的大小; 这里有一个例子:
long count;
if (query.list().size() > 0)
count=(long) criteria.list().get(0);
else
count=0;
return count;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.