Pergunta

Aprendi recentemente que é possível criar novos objetos em JPQL Declarações da seguinte forma:

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

Isso é algo a ser evitado ou melhor, para abraçar? Quando o uso desse recurso é justificado à luz de boas práticas?

Foi útil?

Solução

Não evite, o novo novo é lá porque existem casos de uso perfeitamente válidos para ele, como lembrado no §10.2.7.2. Expressões de construtor JPQL na cláusula selecionada do Especificação EJB 3.0 JPA:

Um construtor pode ser usado na lista de seleção para retornar uma ou mais instâncias Java. A classe especificada não precisa ser uma entidade ou ser mapeada para o banco de dados. O nome do construtor deve ser totalmente qualificado.

Se um nome de classe de entidade for especificado na nova cláusula selecionada, as instâncias de entidade resultantes estarão no novo estado.

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

Em resumo, use o novo seleto quando não quiser recuperar uma entidade completa ou um gráfico completo de objetos de uma maneira segura do tipo (em oposição a um Object[]). Se você mapear o resultado de uma consulta em uma classe de entidade ou uma classe não mapeada dependerá da sua seleção. Um exemplo típico seria uma tela de lista (onde você pode não querer todos os detalhes).

Em outras palavras, não o use em todos os lugares, mas não proíba seu uso (poucas coisas são apenas preto ou branco).

Outras dicas

Você costuma usar esse tipo de consulta quando deseja recuperar um Objeto de transferência de dados. Talvez um relatório possa ser um bom lugar para usá -lo. Se você deseja apenas recuperar um único objeto de domínio (como da família em vez disso), então não há razão para usá -lo.

Um objeto criado com o novo não precisa ser um DTO, ou seja, um objeto que será exportado pela camada de negócios. Também pode ser um objeto de domínio POJO, ou seja, um objeto usado internamente pela camada de negócios.

A razão para usar esse tipo de poços como um objeto parcial, em vez da entidade JPA completa, é o desempenho em tipos específicos de junções. Um ótimo recurso que explica isso é: http://use-the-index-luke.com/sql/join/hash-join-partial-objects

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top