2009-10-16 12 views
16

Qualcuno può dirmi i motivi intrinseci per cui in EntityManager JPA 1.0 quando si recupera un oggetto tramite find, si deve gestire null se non trovato, ma quando si utilizza l'interfaccia di query tramite createQuery getResultList genera una NoResultException quando non viene trovata.Perché in JPA EntityManager le query generano NoResultException ma find non lo fa?

Forse mi manca qualcosa ma mi sento molto incoerente per un linguaggio, e in realtà ho dovuto fare un sacco di redesing a causa del passaggio da un semplice finder a una query più fine utilizzando l'interfaccia di query.

Grazie ragazzi.

+0

Penso che tu abbia sbagliato. queryForObject() genera un'eccezione. queryForList() restituisce una lista vuota. – cletus

+0

Hai capito qualcosa. Sto parlando di javax.persistence.EntityManager e javax.persistence.Query. Controlla quelle interfacce che capirai. –

risposta

7

Quando si esegue una ricerca, jpa utilizza la chiave primaria per individuare l'oggetto entità, spesso utilizzando la cache di secondo livello ed è in genere molto più veloce di createQuery e getSingleResult.

È possibile ottenere null o l'oggetto indietro da trovare. Quando si crea createQuery e istanze dell'oggetto Query. Se fai una getResultList, non genererà una NoResultException, solo se esegui un getSingleResult genererà quell'eccezione. Se si esegue getResultList e non viene trovato nessuno, verrà restituito null.

+4

Quello è corretto sì. Non mi è ancora chiaro il motivo per cui le persone della specifica JPA hanno deciso in un caso di lanciare una noresultexception e nell'altra solo restituire null, se la sua operazione logicamente molto simile. Il fatto che si tratti di un'eccezione non controllata non rende più semplice ... o si è invertito: cosa si diceva contro la restituzione di null da getSingleResult contro il lancio di un'eccezione? Secondo il mio punto di vista, sarebbe più coerente: o lanciare un NoREsultExcpetion in getSingleResult e trovare o restituire null. ma non mescolarlo –

+0

getResultList() almeno w/Eclipselink (che è l'implementazione di riferimento JPA2) restituirà un elenco vuoto non un valore NULL. – NBW

+1

Sì per JPA2, ma la domanda al momento non era per JPA2, ma JPA –

-1

Penso che elimina questo controllo nullo:

Object o = q.getSingleResult(); 
if (o != null) 
    return (MyObj) o; 
return o; 

Introducendo una RuntimeException (NoResultException), i programmatori possono lanciare in modo sicuro q.getSingleResult() per MyObj, e lasciare l'eccezione al chiamante.

Per quanto riguarda q.getResultList(), restituirà sempre un elenco, il controllo null non è necessario.

Ma sento ancora questo non intuitivo.

+2

-1 Non è necessario controllare 'null' prima del casting, quindi questo sarebbe esattamente lo stesso di' return (MyObj) q.getSingleResult() ' –

+0

Didier ha ragione. Puoi assegnare null a qualsiasi tipo. – Spina

+0

scusate, mio ​​cattivo :( – smallufo

21

Le query possono essere utilizzate per recuperare quasi tutto compreso il valore di una singola colonna in una singola riga.

Se getSingleResult() restituisce null, non è possibile stabilire se la query non corrisponde a nessuna riga o se la query corrisponde a una riga ma la colonna selezionata contiene null come valore.

Problemi correlati