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;