Risposte:
Hai ragione. La specifica JPA non dice nulla al riguardo. Ma il libro Java Persistence with Hibernate, seconda edizione , dice:
Se il risultato della query è vuoto, viene restituito un valore nullo
L'implementazione di Hibernate JPA (Entity Manager) restituisce null quando si chiama query.getResultList () senza risultato.
AGGIORNARE
Come sottolineato da alcuni utenti, sembra che una versione più recente di Hibernate restituisca invece un elenco vuoto.
Quando non vengono trovati risultati, viene restituito un elenco vuoto anche in Eclipselink.
if(rows == null || rows.size == 0){}
dove righe è ciò che restituisce getResultList ()
null
invece di una lista vuota non sia ciò che è inteso dalle specifiche in quanto altrimenti rende abbastanza chiaro quando aspettarsi null
in altri posti. Soprattutto perché la documentazione per le getResultList
letture Execute a SELECT query and return the query results as a(n) (un)typed List. - @return a list of the results
. null
Ovviamente controllerei ancora e restituirei un elenco vuoto se necessario.
Se le specifiche dicessero che non poteva succedere, ci crederesti? Dato che il tuo codice potrebbe plausibilmente funzionare contro diverse implementazioni JPA, ti fideresti di ogni implementatore per farlo bene?
Non importa cosa, codificherei in modo difensivo e verificherei null.
Ora la grande domanda: dovremmo trattare "null" e una lista vuota come sinonimi? È qui che le specifiche dovrebbero aiutarci, e non lo fanno.
La mia ipotesi è che un ritorno nullo (se effettivamente potesse accadere) sarebbe equivalente a "Non ho capito la query" e un elenco vuoto sarebbe "sì, ho capito la query, ma non c'erano record".
Forse hai un percorso di codice (probabilmente un'eccezione) che si occupa di query non analizzabili, tenderei a indirizzare un ritorno nullo lungo quel percorso.
Exception
, restituire null
dove si Collection
trova nel tipo di ritorno è un ovvio difetto di progettazione
Contrariamente al post di Arthur, quando ho eseguito una query a cui nessuna entità corrisponde, ho ottenuto un elenco vuoto, non nullo. Questo sta usando Hibernate ed è quello che considero un comportamento corretto: un elenco vuoto è la risposta corretta quando chiedi una raccolta di entità e non ce ne sono.
Se osservi attentamente la org.hibernate.loader.Loader
(4.1) vedrai che la lista è sempre inizializzata all'interno del metodo processResultSet () ( doc , source ).
protected List processResultSet(...) throws SQLException {
final List results = new ArrayList();
handleEmptyCollections( queryParameters.getCollectionKeys(), rs, session );
...
return results;
}
Quindi non penso che ora restituirà null.
Ovviamente, se provi il set di risultati con CollectionUtils.isNotEmpty di Jakarta, sei coperto in entrambi i casi.
Query.getResultList()
restituisce un elenco vuoto invece di null
. Quindi controlla isEmpty()
il risultato restituito e continua con il resto della logica se è falso.
Data l'implementazione di getResultsList()
in org.hibernate.ejb.QueryImpl
classe, è possibile restituire 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;
}
La mia versione di ibernazione è: 3.3.1.GA