2009-07-12 12 views

risposta

57

Hai ragione. Le specifiche JPA non dicono nulla a riguardo. Ma Java Persistence con Hibernate libro, 2a edizione, dice:

Se il risultato della query è vuoto, un nulla viene restituito

implementazione

Hibernate JPA (Entity Manager) di ritorno nullo quando si chiama interrogazione .getResultList() senza risultati.

UPDATE

Come sottolineato da alcuni utenti, sembra che una versione più recente di Hibernate restituisce una lista vuota, invece.

+19

Questo è certamente obsoleto, Hibernate restituisce una lista vuota. –

+4

Da quale versione? – Tom

+1

Ancora ottengo null da Hibernate 4.3.10 (eseguito come motore JPA per Spring Data). Ciò si verifica solo per una singola query nativa, poiché le query JPA tipiche funzionano come previsto. –

20

Se le specifiche dicessero che non potrebbe accadere, vorresti crederle? Dato che il tuo codice potrebbe in teoria funzionare contro diverse implementazioni JPA, ti fideresti di ogni implementatore per farlo bene?

Non importa cosa, vorrei codice in modo difensivo e controllo per null.

Ora la grande domanda: dovremmo considerare "nullo" e anche un elenco vuoto? Questo è dove le specifiche dovrebbero aiutarci, e no.

La mia ipotesi è che un ritorno nullo (se davvero potrebbe accadere) sarebbe equivalente a "Non ho capito la query" e la lista vuota sarebbe "sì, capito la query, ma non ci sono stati record".

Forse si dispone di un percorso di codice (probabilmente un'eccezione) che si occupa di query non parificabili, tenderei a indirizzare un ritorno nullo su quel percorso.

+0

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

+0

Modificato per aggiungere: Arthur ha sottolineato che l'HPA di Hibernate restituisce un valore nullo se non viene trovato alcun record. Quindi, in questo caso, abbiamo bisogno di piegare insieme la lista vuota e vuota. Credo che il processo di pensiero che abbiamo analizzato sopra sia ancora valido. È anche ipotizzabile che dovremmo avere diversi trattamenti di null per diversi stack JPA. Benvenuti alla portabilità divertente. – djna

+0

concordato. Esiste solo "portabilità divertente" a causa delle specifiche JPA che non fanno ciò che dovrebbe fare ... specificare la semantica precisa.La vergogna è gestita da un comitato con interessi acquisiti. – DataNucleus

13

Contrariamente al post di Arthur, quando ho effettivamente eseguito una query che nessuna entità corrisponde ho ottenuto una lista vuota, non null. Questo sta usando Hibernate ed è quello che considero un comportamento corretto: una lista vuota è la risposta corretta quando chiedi una raccolta di entità e non ce ne sono.

+2

per OpenJPA, ho anche una lista vuota invece di null. – Gnavvy

1

Naturalmente, se si verifica il set di risultati con CollectionUtils.isNotEmpty di Jakarta, si è coperti in entrambi i modi.

1

Se si dà un'occhiata da vicino al org.hibernate.loader.Loader (4.1) si vedrà che l'elenco è 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 restituirà nulla ora.

+2

Applausi per lo snippet di codice esatto. Ma questa risposta si concentra solo sull'ibernazione che è una delle implementazioni delle specifiche. Altre implementazioni come OpenJPA differiscono nel comportamento. Inoltre, l'ibernazione sembra aver cambiato il comportamento rispetto alle diverse versioni. – venky

Problemi correlati