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

E se sì, in quali circostanze?

Le specifiche Javadoc e JPA non dicono nulla.

Hai ragione. Le specifiche JPA non dicono nulla a riguardo. Ma Java Persistence with Hibernate book, 2nd edition , dice:

Se il risultato della query è vuoto, viene restituito un valore nullo

L’implementazione di HEP in ibernazione (Entity Manager) restituisce null quando si chiama query.getResultList () senza risultati.

AGGIORNARE

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

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 controllare per nulla.

Ora la grande domanda: dovremmo trattare anche “null” e una lista vuota? 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 domanda, ma non ci sono stati record”.

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

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

Se osservi attentamente org.hibernate.loader.Loader (4.1) vedrai che l’elenco è sempre inizializzato 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.

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