Org.hibernate.NonUniqueResultException: запрос не возвратил уникальный результат: 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(); //line 1
Hibernate выбрасывает исключение в строке 1
org.hibernate.NonUniqueResultException: query did not return a unique result:
Я не уверен, что происходит, поскольку count (*) всегда будет возвращать только одну строку. Также, когда я запускаю этот запрос непосредственно на db, он возвращает результат как 1. Итак, в чем проблема?
Ответы
Ответ 1
Кажется, что ваш запрос возвращает более одного результата проверки базы данных. В документации query.uniqueResult()
вы можете прочитать:
Throws: org.hibernate.NonUniqueResultException - если есть больше чем один результат соответствия
Если вы хотите избежать этой ошибки и по-прежнему использовать уникальный запрос результата, вы можете использовать этот способ обхода query.setMaxResults(1).uniqueResult();
Ответ 2
Я не думаю, что другие ответы объяснили ключевую часть: почему "COUNT (*)" возвращает более одного результата?
Я только что столкнулся с той же проблемой сегодня, и обнаружил, что если у вас есть другой класс, расширяющий целевой класс отображения (здесь "CustomerData"), Hibernate сделает эту магию.
Надеюсь, это сэкономит время для других несчастных парней.
Ответ 3
Это означает, что написанный вами запрос возвращает более одного элемента (результата), в то время как ваш код ожидает один результат.
Ответ 4
Hibernate Необязательный findTopByClientIdAndStatusOrderByCreateTimeDesc (Integer clientId, Integer status);
"FindTop" !! Единственный результат!
Ответ 5
По сути, ваш запрос возвращает более одного набора результатов. В API Docs метод uniqueResult() говорит, что метод Convenience возвращает один экземпляр, соответствующий запросу, или ноль, если запрос не возвращает результатов.
Метод uniqueResult() выдает только один результат
Ответ 6
запросить несколько строк, а не одну строку или ваш
Ответ 7
Сначала вы должны проверить размер списка запросов; здесь пример:
long count;
if (query.list().size() > 0)
count=(long) criteria.list().get(0);
else
count=0;
return count;