Esto ciertamente está desactualizado, Hibernate devuelve una lista vacía.
Michael Laffargue
2
Todavía obtengo nulo de Hibernate 4.3.10 (ejecutándose como motor JPA para Spring Data). Esto solo sucede para una única consulta nativa, ya que las consultas JPA típicas funcionan como se esperaba.
Jacek Prucia
1
Simplemente verifique ambas condiciones usando OR. if(rows == null || rows.size == 0){}donde filas es lo que devuelve getResultList ()
Number945
Simplemente envuélvalo en un Optional.ofNullable () y listo.
de.la.ru
Creo que regresar en nulllugar de una lista vacía no es lo que pretende la especificación, ya que de lo contrario deja bastante claro cuándo esperar nullen otros lugares. Especialmente como la documentación para getResultListlecturas Execute a SELECT query and return the query results as a(n) (un)typed List. - @return a list of the results. Por nullsupuesto , todavía buscaría y devolvería una lista vacía si fuera necesario.
René
23
Si las especificaciones dijeran que no podría suceder, ¿las creerías? Dado que su código posiblemente podría ejecutarse en diferentes implementaciones de JPA, ¿confiaría en que cada implementador lo haga bien?
No importa qué, codificaría a la defensiva y buscaría nulo.
Ahora la gran pregunta: ¿deberíamos tratar "nulo" y una Lista vacía como sinónimos? Aquí es donde las especificaciones deberían ayudarnos, y no.
Supongo que una devolución nula (si es que pudiera suceder) sería equivalente a "No entendí la consulta" y la lista vacía sería "Sí, entendí la consulta, pero no había registros".
Quizás tenga una ruta de código (probablemente una excepción) que se ocupa de consultas no analizables, yo tendería a dirigir un retorno nulo por esa ruta.
+1 tiene tanta razón al decir: "¿confiaría en todos los proveedores de JPA?" NO :)
dfa
Editado para agregar: Arthur ha señalado que el JPA de Hibernate de hecho devuelve nulo si no se encuentran registros. Entonces, de hecho, en este caso, necesitamos plegar la lista nula y vacía. Creo que el proceso de pensamiento por el que pasamos arriba sigue siendo válido. Incluso es concebible que debamos tener diferentes tratamientos de nulo para diferentes pilas de JPA. Bienvenido a la diversión de la portabilidad.
djna
Convenido. Solo existe "diversión de portabilidad" debido a que la especificación JPA no hace lo que debería hacer ... especifique la semántica precisa. Es una pena que esté dirigido por un comité con intereses creados.
DataNucleus
2
"No entendí la consulta" debería manejarse como Exception, devolver nulldonde Collectionestá en el tipo de retorno es un defecto de diseño obvio
matoni
13
Al contrario de la publicación de Arthur, cuando en realidad ejecuté una consulta que no coincidía con ninguna entidad, obtuve una lista vacía, no nula. Esto está usando Hibernate y es lo que considero el comportamiento correcto: una lista vacía es la respuesta correcta cuando solicita una colección de entidades y no hay ninguna.
Saludos por el fragmento de código exacto. Pero esta respuesta se centra solo en hibernar, que es una de las implementaciones de la especificación. Otras implementaciones como OpenJPA difieren en el comportamiento. Además, hibernate parece haber cambiado el comportamiento en diferentes versiones.
venky
1
Por supuesto, si prueba el conjunto de resultados con CollectionUtils.isNotEmpty de Jakarta, estará cubierto de cualquier manera.
Query.getResultList()devuelve una lista vacía en lugar de null. Por lo tanto, verifique isEmpty()el resultado devuelto y continúe con el resto de la lógica si es falso.
Dada la implementación de getResultsList()in org.hibernate.ejb.QueryImplclass, es posible devolver un null:
publicList getResultList(){try{return query.list();}catch(QueryExecutionRequestException he){thrownewIllegalStateException(he);}catch(TypeMismatchException e ){thrownewIllegalArgumentException(e);}catch(HibernateException he){
em.throwPersistenceException( he );returnnull;}
Respuestas:
Tienes razón. La especificación JPA no dice nada al respecto. Pero el libro Java Persistence with Hibernate, segunda edición , dice:
La implementación de Hibernate JPA (Entity Manager) devuelve nulo cuando llamas a query.getResultList () sin resultado.
ACTUALIZAR
Como señalan algunos usuarios, parece que una versión más reciente de Hibernate devuelve una lista vacía.
También se devuelve una lista vacía en Eclipselink cuando no se encuentran resultados.
fuente
if(rows == null || rows.size == 0){}
donde filas es lo que devuelve getResultList ()null
lugar de una lista vacía no es lo que pretende la especificación, ya que de lo contrario deja bastante claro cuándo esperarnull
en otros lugares. Especialmente como la documentación paragetResultList
lecturasExecute a SELECT query and return the query results as a(n) (un)typed List. - @return a list of the results
. Pornull
supuesto , todavía buscaría y devolvería una lista vacía si fuera necesario.Si las especificaciones dijeran que no podría suceder, ¿las creerías? Dado que su código posiblemente podría ejecutarse en diferentes implementaciones de JPA, ¿confiaría en que cada implementador lo haga bien?
No importa qué, codificaría a la defensiva y buscaría nulo.
Ahora la gran pregunta: ¿deberíamos tratar "nulo" y una Lista vacía como sinónimos? Aquí es donde las especificaciones deberían ayudarnos, y no.
Supongo que una devolución nula (si es que pudiera suceder) sería equivalente a "No entendí la consulta" y la lista vacía sería "Sí, entendí la consulta, pero no había registros".
Quizás tenga una ruta de código (probablemente una excepción) que se ocupa de consultas no analizables, yo tendería a dirigir un retorno nulo por esa ruta.
fuente
Exception
, devolvernull
dondeCollection
está en el tipo de retorno es un defecto de diseño obvioAl contrario de la publicación de Arthur, cuando en realidad ejecuté una consulta que no coincidía con ninguna entidad, obtuve una lista vacía, no nula. Esto está usando Hibernate y es lo que considero el comportamiento correcto: una lista vacía es la respuesta correcta cuando solicita una colección de entidades y no hay ninguna.
fuente
Si observa de cerca
org.hibernate.loader.Loader
(4.1), verá que la lista siempre se inicializa dentro del método processResultSet () ( doc , source ).Así que no creo que vuelva a ser nulo ahora.
fuente
Por supuesto, si prueba el conjunto de resultados con CollectionUtils.isNotEmpty de Jakarta, estará cubierto de cualquier manera.
fuente
Query.getResultList()
devuelve una lista vacía en lugar denull
. Por lo tanto, verifiqueisEmpty()
el resultado devuelto y continúe con el resto de la lógica si es falso.fuente
Dada la implementación de
getResultsList()
inorg.hibernate.ejb.QueryImpl
class, es posible devolver unnull
:Mi versión de hibernación es: 3.3.1.GA
fuente