Pregunta

Recientemente aprendí que es posible crear nuevos objetos en JPQL declaraciones de la siguiente manera:

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

¿Es esto algo a evitar o más bien para abrazar? ¿Cuándo se justifica el uso de esta característica a la luz de las buenas prácticas?

¿Fue útil?

Solución

No lo evites, lo nuevo seleccionado está allí porque hay casos de uso perfectamente válidos para ello según lo recordado en el §10.2.7.2. Expresiones del constructor JPQL en la cláusula de selección del Especificación EJB 3.0 JPA:

Se puede usar un constructor en la lista Seleccionar para devolver una o más instancias de Java. No se requiere que la clase especificada sea una entidad o que se asigne a la base de datos. El nombre del constructor debe estar completamente calificado.

Si se especifica un nombre de clase de entidad en la nueva cláusula SELECT, las instancias de entidad resultantes están en el nuevo estado.

SELECT NEW com.acme.example.CustomerDetails(c.id, c.status, o.count)
FROM Customer c JOIN c.orders o
WHERE o.count > 100

En resumen, use el nuevo Select cuando no desee recuperar una entidad completa o un gráfico completo de objetos de una manera segura (a diferencia de un Object[]). Ya sea que asigne el resultado de una consulta en una clase de entidad o en una clase no mapeada dependerá de su selección. Un ejemplo típico sería una pantalla de lista (donde es posible que no desee todos los detalles).

En otras palabras, no lo use en todas partes, pero no prohíba su uso (pocas cosas son solo en blanco o negro).

Otros consejos

A menudo usa este tipo de consulta cuando desea recuperar un Objeto de transferencia de datos. Tal vez un informe puede ser un buen lugar para usarlo. Si solo quieres recuperar un solo objeto de dominio (como de la familia en su lugar), por lo que no hay razón para usarlo.

Un objeto creado con nuevo no tiene que ser un DTO, es decir, un objeto que será exportado por la capa de negocios. También puede ser un objeto de dominio POJO, es decir, un objeto utilizado internamente por la capa de negocios.

La razón para usar este tipo de Pojos como objeto parcial en lugar de la entidad JPA completa es el rendimiento en tipos específicos de uniones. Un gran recurso que explica esto es: http://use-the-index-luke.com/sql/join/hash-join-partial-objects

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top