¿Puede javax.persistence.Query.getResultList () devolver nulo?

115

Y si es así, ¿en qué circunstancias?

Las especificaciones de Javadoc y JPA no dicen nada.

rdk
fuente
¡Estaba buscando exactamente esta pregunta! tks! hasta 4 usted!
rafa.ferreira

Respuestas:

69

Tienes razón. La especificación JPA no dice nada al respecto. Pero el libro Java Persistence with Hibernate, segunda edición , dice:

Si el resultado de la consulta está vacío, se devuelve un valor nulo.

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.

Arthur Ronald
fuente
29
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.

djna
fuente
+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.

Andrew Simons
fuente
2
para OpenJPA, también obtengo una lista vacía en lugar de nula.
Gnavvy
3

Si observa de cerca org.hibernate.loader.Loader(4.1), verá que la lista siempre se inicializa dentro del método processResultSet () ( doc , source ).

protected List processResultSet(...) throws SQLException {
   final List results = new ArrayList();

   handleEmptyCollections( queryParameters.getCollectionKeys(), rs, session );
   ...
   return results;

}

Así que no creo que vuelva a ser nulo ahora.

Charles Follet
fuente
2
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.

Al Scherer
fuente
0

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.

Cyril Sojan
fuente
0

Dada la implementación de getResultsList()in org.hibernate.ejb.QueryImplclass, es posible devolver un null:

public List getResultList() {
    try {
        return query.list();
    }
    catch (QueryExecutionRequestException he) {
        throw new IllegalStateException(he);
    }
    catch( TypeMismatchException e ) {
        throw new IllegalArgumentException(e);
    }
    catch (HibernateException he) {
        em.throwPersistenceException( he );
        return null;
    }

Mi versión de hibernación es: 3.3.1.GA

wile el coyote
fuente