Respuestas:
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.
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 esperar null
en otros lugares. Especialmente como la documentación para getResultList
lecturas Execute a SELECT query and return the query results as a(n) (un)typed List. - @return a list of the results
. Por null
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.
Exception
, devolver null
donde Collection
está en el tipo de retorno es un defecto de diseño obvio
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.
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.
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.QueryImpl
class, 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