Javax.persistence.Query.getResultList () può restituire null?


115

E se sì, in quali circostanze?

Le specifiche Javadoc e JPA non dicono nulla.


Stavo cercando esattamente questa domanda! tks! up 4 you!
rafa.ferreira

Risposte:


69

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.


29
Questo è certamente obsoleto, Hibernate restituisce un elenco vuoto.
Michael Laffargue

2
Ottengo ancora null da Hibernate 4.3.10 (in esecuzione come motore JPA per Spring Data). Ciò accade solo per una singola query nativa, poiché le query JPA tipiche funzionano come previsto.
Jacek Prucia

1
Controlla entrambe le condizioni usando OR. if(rows == null || rows.size == 0){}dove righe è ciò che restituisce getResultList ()
Number945

Basta racchiuderlo in un Optional.ofNullable () e il gioco è fatto.
de.la.ru

Credo che restituire nullinvece di una lista vuota non sia ciò che è inteso dalle specifiche in quanto altrimenti rende abbastanza chiaro quando aspettarsi nullin altri posti. Soprattutto perché la documentazione per le getResultListletture Execute a SELECT query and return the query results as a(n) (un)typed List. - @return a list of the results. nullOvviamente controllerei ancora e restituirei un elenco vuoto se necessario.
René

23

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.


+1 hai così ragione quando dici: "ti fideresti di ogni fornitore di JPA?" NO :)
dfa

Modificato per aggiungere: Arthur ha sottolineato che l'APP di Hibernate in effetti restituisce null se non vengono trovati record. Quindi, in effetti, in questo caso, abbiamo bisogno di piegare insieme un elenco vuoto e nullo. Credo che il processo di pensiero che abbiamo seguito sopra sia ancora valido. È anche concepibile che dovremmo avere diversi trattamenti di null per diversi stack JPA. Benvenuti nel divertimento della portabilità.
djna

Concordato. Esiste solo il "divertimento della portabilità" dovuto al fatto che le specifiche JPA non fanno ciò che dovrebbe fare ... specificare la semantica precisa. Peccato che sia gestito da un comitato con interessi acquisiti.
DataNucleus

2
"Non ho capito la query" dovrebbe essere gestito in quanto Exception, restituire nulldove si Collectiontrova nel tipo di ritorno è un ovvio difetto di progettazione
matoni

13

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.


2
per OpenJPA, ottengo anche un elenco vuoto invece di null.
Gnavvy

3

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.


2
Grazie per lo snippet di codice esatto. Ma questa risposta si concentra solo sull'ibernazione, che è una delle implementazioni della specifica. Altre implementazioni come OpenJPA differiscono nel comportamento. Inoltre, l'ibernazione sembra aver modificato il comportamento su diverse versioni.
venky

1

Ovviamente, se provi il set di risultati con CollectionUtils.isNotEmpty di Jakarta, sei coperto in entrambi i casi.


0

Query.getResultList()restituisce un elenco vuoto invece di null. Quindi controlla isEmpty()il risultato restituito e continua con il resto della logica se è falso.


0

Data l'implementazione di getResultsList()in org.hibernate.ejb.QueryImplclasse, è 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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.