with query getsingleresult getresultlist example createnativequery create array java hibernate jpa

java - query - jpa getsingleresult example



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

Contrariamente a la publicación de Arthur, cuando 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 un comportamiento correcto: una lista vacía es la respuesta correcta cuando solicita una colección de entidades y no hay ninguna.

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

Las especificaciones Javadoc y JPA no dicen nada.


Por supuesto, si prueba el conjunto de resultados con CollectionUtils.isNotEmpty de Yakarta, estará cubierto de cualquier manera.


Si las especificaciones dicen que no podría suceder, ¿les creerías? Dado que es posible que su código se ejecute contra diferentes implementaciones de JPA, ¿podría confiar en que cada implementador lo haga bien?

No importa qué, codificaría a la defensiva y verificaría nulo.

Ahora la gran pregunta: ¿deberíamos tratar "nulo" y una lista vacía también? Aquí es donde las especificaciones deberían ayudarnos, y no es así.

Mi suposición es que un retorno nulo (si de hecho podría suceder) sería equivalente a "No entendí la consulta" y la lista vacía sería "sí, entendí la consulta, pero no hubo registros".

Tal vez tenga una ruta de código (probablemente una excepción) que se ocupa de consultas irreprochables, yo tendería a dirigir un retorno nulo por esa ruta.


Si observa de cerca el 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.


Tienes razón. La especificación JPA no dice nada al respecto. Pero el libro de Java Persistence with Hibernate, 2nd edition , dice:

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

La implementación de HFP de Hibernate (Entity Manager) devuelve nulo cuando se llama a query.getResultList () sin resultado.

ACTUALIZAR

Como señalaron algunos usuarios, parece que una versión más reciente de Hibernate devuelve una lista vacía.