JPQL Crea un nuovo object in Select Statement – evita o abbraccia?

Recentemente ho imparato che è ansible creare nuovi oggetti in istruzioni JPQL come segue:

 select new Family(mother, mate, offspr) from DomesticCat as mother join mother.mate as mate left join mother.kittens as offspr 

È qualcosa da evitare o meglio da abbracciare? Quando l’utilizzo di questa funzionalità è giustificato alla luce delle buone pratiche?

Non evitarlo , SELECT NEW è lì perché ci sono casi d’uso perfettamente validi per questo come ricordato nel §10.2.7.2. Espressioni di costruttori JPQL nella clausola SELECT della specifica JPA EJB 3.0 :

Un costruttore può essere utilizzato nell’elenco SELECT per restituire una o più istanze Java. La class specificata non è richiesta per essere un’entity framework o per essere mappata al database. Il nome del costruttore deve essere pienamente qualificato.

Se il nome della class di entity framework è specificato nella clausola SELECT NEW, le istanze di quadro risultanti si trovano nel 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 SELECT NEW quando non si desidera recuperare un’entity framework completa o un grafico completo degli oggetti in un modo sicuro (invece di un Object[] ). Se si esegue il mapping del risultato di una query in una class di entity framework o una class non mappata dipenderà dalla selezione. Un tipico esempio potrebbe essere una schermata di elenco (in cui potresti non voler tutti i dettagli).

In altre parole, non usarlo ovunque ma non vietarne l’uso (poche cose sono solo in bianco o nero).

Spesso si utilizza questo tipo di query quando si desidera recuperare un object di trasferimento dati . Forse un rapporto può essere un buon posto per usarlo. Se vuoi semplicemente recuperare un singolo object di dominio (come invece dalla famiglia ), quindi non c’è motivo di usarlo.

Un object creato con nuovo non deve essere un DTO, ovvero un object che verrà esportato dal livello aziendale. Può anche essere un object dominio POJO, ovvero un object utilizzato internamente dal livello aziendale.

La ragione per utilizzare questo tipo di POJO come object parziale anziché come quadro JPA completa è la prestazione in tipi specifici di JOIN. Una grande risorsa che spiega questo è: http://use-the-index-luke.com/sql/join/hash-join-partial-objects