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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top