JPQL Crea nuovo oggetto nella Select - evitare o abbracciare?
Domanda
Ho imparato di recente che è possibile creare nuovi oggetti in dichiarazioni JPQL
come segue:
select new Family(mother, mate, offspr)
from DomesticCat as mother
join mother.mate as mate
left join mother.kittens as offspr
E 'questo qualcosa da evitare, o meglio ad abbracciare? Quando viene l'utilizzo di questa funzione giustificato alla luce delle buone pratiche?
Soluzione
Non evitarlo , il selezionare Nuovo è lì perché ci sono casi di utilizzo perfettamente validi per come ricordato nel §10.2.7.2. JPQL Costruttore espressioni nella clausola SELECT di EJB 3.0 JPA Specification :
Un costruttore può essere utilizzato nel nell'elenco SELECT per tornare uno o più Java le istanze. La classe non è specificato richiesto di essere un'entità o essere mappato al database. Il nome del costruttore deve essere pienamente qualificato.
Se non viene specificato un nome di classe di entità Nella nuova clausola SELECT, il le istanze di entità risultanti sono in nuovo stato.
SELECT NEW com.acme.example.CustomerDetails(c.id, c.status, o.count) FROM Customer c JOIN c.orders o WHERE o.count > 100
In breve, utilizzare la SELEZIONA NUOVI quando non si desidera recuperare un'entità completa o un grafico pieno di oggetti in un tipo modo sicuro (al contrario di un Object[]
). Sia che si mappa il risultato di una query in una classe di entità o di una classe non mappata dipenderà dal vostro selezionare. Un esempio tipico potrebbe essere una schermata di elenco (in cui non si potrebbe desiderare tutti i dettagli).
In altre parole, non usare ovunque, ma non impedire il suo utilizzo (poche cose sono solo bianco o nero).
Altri suggerimenti
Si utilizza spesso questo tipo di query quando si desidera recuperare un Trasferimento dati oggetto . Forse un rapporto può essere un buon posto per usarlo. Se si desidera solo per recuperare un oggetto singolo dominio (come dalla famiglia , invece), quindi non c'è alcun motivo per usarlo.
Un oggetto creato con il nuovo non deve essere un DTO, vale a dire un oggetto che verrà esportata dallo strato business. Può anche essere un oggetto POJO Dominio, cioè un oggetto utilizzato internamente dallo strato aziendali.
Il motivo di utilizzare questo tipo di POJO come un oggetto parziale, invece della piena JPA Entity è la prestazione in specifici tipi di join. Una grande risorsa che spiega questo è: http: // uso -the-index-luke.com/sql/join/hash-join-partial-objects