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

时间:2014-05-26 09:15:45

标签: 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

Hibernate在第1行抛出异常

    org.hibernate.NonUniqueResultException: query did not return a unique result: 

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

11 个答案:

答案 0 :(得分:19)

您的查询似乎返回多个结果检查数据库。在query.uniqueResult()的文档中,您可以阅读:

  

抛出:org.hibernate.NonUniqueResultException - 如果还有更多   比一个匹配的结果

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

答案 1 :(得分:3)

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

List<T>

,然后将结果放入单个T对象。

在强制转换为长错误的情况下,除了建议使用包装器类以使所有列都发挥相同作用外,我猜交易或查询本身中的问题也会导致此问题。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

我今天也遇到了同样的问题,我发现如果您有另一个扩展目标映射类的类(这里是“ CustomerData”),Hibernate将发挥这种魔力。

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

答案 4 :(得分:1)

休眠  可选的findTopByClientIdAndStatusOrderByCreateTimeDesc(Integer clientId,Integer status);

“ findTop”!唯一的结果!

答案 5 :(得分:0)

基本上,您的查询返回多个结果集。  在API文档中,uniqueResult()方法表示   便捷方法,可返回与之匹配的单个实例  查询,如果查询未返回结果,则返回null

uniqueResult()方法仅产生单个结果集

答案 6 :(得分:0)

在未完成的事务中(您的应用程序试图创建一个实体,该实体的字段与您尝试查找单个实体的标识符重复)会抛出该异常吗?

在这种情况下,新的(重复的)实体将在数据库中不可见,因为事务将不再存在,并且永远不会提交给db。但是,仍然会引发异常。

答案 7 :(得分:0)

这种想法可能对某人有所帮助,因为“当数据查询的数量大于1时”。reference

答案 8 :(得分:0)

在执行其他正确的休眠查询时收到此错误。问题是,当让一个类扩展另一个休眠时,两者都计算在内。可以通过向存储库类添加方法来“修复”此错误。

通过覆盖类计数,您可以手动确定计数方式。

@Override 
public Integer count(Page<MyObject> page) {
   // manual counting method here
}

答案 9 :(得分:0)

正如 Ian Wang 所说,我怀疑您使用的是 spring 的存储库。几天前,您只是复制了一个类,但在最终未使用时忘记删除它。检查该存储库,看看是否有多个您使用的相同类的表。计数不是行数,而是表问题的计数。

答案 10 :(得分:-5)

首先,您必须测试查询列表大小;这里有一个例子:

long count;
if (query.list().size() > 0)
    count=(long) criteria.list().get(0);   
else
    count=0;            
return count;