org.hibernate.NonUniqueResultException:query没有返回唯一的结果:2?

use*_*603 29 java hibernate

我的代码中有以下代码

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(); //line 1
Run Code Online (Sandbox Code Playgroud)

Hibernate在第1行抛出异常

    org.hibernate.NonUniqueResultException: query did not return a unique result: 
Run Code Online (Sandbox Code Playgroud)

我不确定发生了什么,因为count(*)总是只返回一行.此外,当我直接在db上运行此查询时,它将结果返回为1.那么问题是什么?

GRO*_*X13 20

看起来您的查询返回多个结果检查数据库.在文档中query.uniqueResult()你可以阅读:

抛出:org.hibernate.NonUniqueResultException - 如果有多个匹配结果

如果要避免此错误并仍使用唯一结果请求,则可以使用此类变通方法 query.setMaxResults(1).uniqueResult();


小智 15

Hibernate 可选 findTopByClientIdAndStatusOrderByCreateTimeDesc(Integer clientId, Integer status);

“找顶”!!结果只有一个!


小智 10

我认为其他答案没有解释关键部分:为什么“COUNT(*)”返回多个结果?

我今天刚遇到同样的问题,我发现如果你有另一个类扩展目标映射类(这里是“CustomerData”),Hibernate 会做这个魔术。

希望这会为其他不幸的人节省一些时间。


Maj*_*aei 7

通常,当查询结果(在您的情况下存储在对象中)无法转换为所需的对象时,Oracle 会抛出此异常。例如,当结果是

List<T>
Run Code Online (Sandbox Code Playgroud)

并且您将结果放入单个 T 对象中。

在强制转换为长错误的情况下,除了建议使用包装器类以便所有列的行为都相同之外,我猜事务或查询本身的问题会导致此问题。


小智 5

这意味着您编写的查询返回多个元素(结果),而您的代码需要一个结果。


小智 -7

首先你必须测试查询列表的大小;这是一个例子:

long count;
if (query.list().size() > 0)
    count=(long) criteria.list().get(0);   
else
    count=0;            
return count;
Run Code Online (Sandbox Code Playgroud)