我的代码中有以下代码
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.那么问题是什么?
答案 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;