2009-07-12 9 views

Respuesta

57

Tienes razón. La especificación JPA no dice nada al respecto. Pero Java Persistence con el libro de hibernación, 2ª edición, dice:

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

aplicación

Hibernate JPA (entidad gestora) devuelto nulo cuando se llama a consulta .getResultList() sin resultado.

ACTUALIZACIÓN

Como se ha señalado por algunos usuarios, parece que una nueva versión de Hibernate devuelve una lista vacía en su lugar.

+19

Esto está ciertamente desactualizado, Hibernate devuelve una lista vacía. –

+4

¿Desde qué versión? – Tom

+1

Todavía obtengo nulo de Hibernate 4.3.10 (ejecutándose como motor JPA para Spring Data). Esto solo ocurre para una única consulta nativa, ya que las consultas típicas de JPA funcionan como se espera. –

20

Si las especificaciones dicen que no podría suceder, ¿las 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é, codifico a la defensiva y verifico nulo.

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

Supongo 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".

Quizás tenga una ruta de acceso de código (probablemente una excepción) que trata con consultas irrecuperables, tendería a dirigir un retorno nulo por esa ruta.

+0

+1 tienes razón al decir: "¿confiarías en cada proveedor de JPA?" NO :) – dfa

+0

Editado para agregar: Arthur ha señalado que el JPA de Hibernate devuelve nulo si no se encuentran registros. Entonces, de hecho, en este caso, necesitamos doblar la lista nula y vacía. Creo que el proceso de pensamiento que analizamos anteriormente sigue siendo válido. Incluso es concebible que tengamos diferentes tratamientos de nulo para diferentes pilas JPA. Bienvenido a la diversión de la portabilidad. – djna

+0

De acuerdo. Solo existe la "diversión de portabilidad" debido a que la especificación JPA no hace lo que debería hacer ... especifica la semántica precisa.Es una pena que esté dirigido por un comité con intereses creados. – DataNucleus

13

Contrariamente a la publicación de Arthur, cuando realicé una consulta que no correspondía a 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.

+2

para OpenJPA, también recibo una lista vacía en lugar de nula. – Gnavvy

1

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

1

Si usted toma una mirada cercana a la 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.

+2

Saludos por el fragmento de código exacto. Pero esta respuesta se centra únicamente en la hibernación, que es una de las implementaciones de la especificación. Otras implementaciones como OpenJPA difieren en el comportamiento. Además, hibernar parece haber cambiado el comportamiento en diferentes versiones. – venky

Cuestiones relacionadas