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

77

我在我的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(*) 总是只会返回一行。

而且当我直接在数据库上运行此查询时,它将返回结果为 1。那问题是什么呢?


9
问题在于你要求一个 uniqueResult,这意味着只能返回一行结果,但查询却找到了多个结果。 - Stultuske
7
但是count(*)总是只会返回1行。 - user3198603
我刚刚告诉你什么会触发NonUniqueResultException异常。我同意对于计数来说这很奇怪,但还是可以尝试去掉UniqueResult约束条件吗? - Stultuske
2
@user3198603,你解决了这个问题吗?你找到问题的原因了吗? - cнŝdk
如果您的查询结果有多行记录,应该使用NHibernate.IQuery.ListAsync而不是UniqueResultAsync。 - peter70
显示剩余4条评论
16个回答

0

希望这对某人有所帮助,原因是“当数据查询的数量大于1时”参考资料


0

基本上你的查询返回了超过一个结果集。 在API文档中,uniqueResult()方法说明了 方便的方法,返回与查询匹配的单个实例,如果查询没有结果则返回null

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


0
对我来说,错误是由于在application.properties文件中的 spring.jpa.hibernate.ddl-auto=update 替换为 spring.jpa.hibernate.ddl-auto=create引起的。这解决了问题,但仍取决于您在项目中需要哪种配置,有关此主题的更多见解,请查看this

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

0

这意味着ORM技术并没有预先编程为您提供所需的结果,因为数据库中有太多相同的结果。例如,如果我的数据库中有多个相同的值,并且我想要将其取回,您将遇到与选择查询相同的错误。


3
您的帖子不易阅读,但似乎是为了回答问题而作出的尝试。我建议您请一位更熟练的人帮助编辑,根据[答案]进行改进。 - Yunnosch

-7

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接