繁体   English   中英

org.hibernate.NonUniqueResultException:查询未返回唯一结果:2?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM