Réponses:
Vous avez raison. La spécification JPA n'en dit rien. Mais le livre Java Persistence with Hibernate, 2e édition , dit:
Si le résultat de la requête est vide, un null est renvoyé
L'implémentation Hibernate JPA (Entity Manager) renvoie null lorsque vous appelez query.getResultList () sans résultat.
METTRE À JOUR
Comme l'ont souligné certains utilisateurs, il semble qu'une dernière version d'Hibernate renvoie une liste vide à la place.
Une liste vide est également renvoyée dans Eclipselink lorsqu'aucun résultat n'est trouvé.
if(rows == null || rows.size == 0){}
où les lignes est ce que la getResultList () renvoie
null
au lieu d'une liste vide n'est pas ce que la spécification vise, car cela indique assez clairement quand il faut s'attendre null
à d'autres endroits. Surtout que la documentation pour les getResultList
lectures Execute a SELECT query and return the query results as a(n) (un)typed List. - @return a list of the results
. Je vérifierais toujours null
bien sûr et retournerais moi-même une liste vide si nécessaire.
Si les spécifications disaient que cela ne pouvait pas arriver, les croiriez-vous? Étant donné que votre code pourrait éventuellement fonctionner avec différentes implémentations JPA, feriez-vous confiance à chaque implémenteur pour bien faire les choses?
Quoi qu'il en soit, je coderais de manière défensive et vérifierais null.
Maintenant, la grande question: devons-nous également traiter "null" et une liste vide? C'est là que les spécifications devraient nous aider, et non.
Je suppose qu'un retour nul (si effectivement cela pouvait arriver) serait équivalent à "Je n'ai pas compris la requête" et une liste vide serait "Oui, j'ai compris la requête, mais il n'y avait pas d'enregistrements".
Vous avez peut-être un chemin de code (probablement une exception) qui traite des requêtes non analysables, j'aurais tendance à diriger un retour nul sur ce chemin.
Exception
, renvoyer null
où Collection
est dans le type de retour est un défaut de conception évident
Contrairement à l'article d'Arthur, lorsque j'ai exécuté une requête à laquelle aucune entité ne correspondait, j'ai obtenu une liste vide, non nulle. Cela utilise Hibernate et c'est ce que je considère comme un comportement correct: une liste vide est la bonne réponse lorsque vous demandez une collection d'entités et qu'il n'y en a pas.
Si vous regardez de plus près le org.hibernate.loader.Loader
(4.1), vous verrez que la liste est toujours initialisée dans la méthode processResultSet () ( doc , source ).
protected List processResultSet(...) throws SQLException {
final List results = new ArrayList();
handleEmptyCollections( queryParameters.getCollectionKeys(), rs, session );
...
return results;
}
Donc je ne pense pas qu'il retournera null maintenant.
Bien sûr, si vous testez l'ensemble de résultats avec CollectionUtils.isNotEmpty de Jakarta, vous êtes couvert de toute façon.
Query.getResultList()
renvoie une liste vide au lieu de null
. Vérifiez donc isEmpty()
le résultat renvoyé et continuez avec le reste de la logique s'il est faux.
Compte tenu de l'implémentation de getResultsList()
in org.hibernate.ejb.QueryImpl
class, il est possible de retourner 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;
}
Ma version d'hibernation est: 3.3.1.GA