java - example - org.hibernate.NonUniqueResultException: la consulta no devolvió un resultado único: 2?
hibernate orm (5)
Tengo código debajo de mi 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 lanza por debajo de la excepción en la línea 1.
org.hibernate.NonUniqueResultException: query did not return a unique result:
No estoy seguro de lo que está sucediendo ya que count (*) siempre devolverá solo una fila. También cuando ejecuto esta consulta en db directamente, devuelve el resultado como 1. ¿Cuál es el problema?
Básicamente, su consulta devuelve más de un conjunto de resultados. En API Docs, el método uniqueResult () dice que el método Convenience para devolver una instancia única que coincida con la consulta, o nulo si la consulta no devuelve resultados
El método uniqueResult () produce solo un único conjunto de resultados
No creo que otras respuestas explicaran la parte clave: ¿por qué "COUNT (*)" devuelve más de un resultado?
Me acabo de encontrar el mismo problema hoy, y lo que descubrí es que si tiene otra clase que extiende la clase asignada objetivo (aquí "CustomerData"), Hibernate hará esta magia.
Espero que esto ahorre tiempo para otros chicos desafortunados.
Parece que su consulta devuelve más de un resultado, verifique la base de datos. En la documentación de query.uniqueResult()
puede leer:
Emite: org.hibernate.NonUniqueResultException - si hay más de un resultado coincidente
Si desea evitar este error y seguir utilizando una solicitud de resultados única, puede usar este tipo de solución de consulta query.setMaxResults(1).uniqueResult();
Primero debes probar el tamaño de la lista de consulta; aquí un ejemplo:
long count;
if (query.list().size() > 0)
count=(long) criteria.list().get(0);
else
count=0;
return count;
Significa que la consulta que escribió devuelve más de un elemento (resultado), mientras que su código espera un solo resultado.