Pergunta

Existe uma heurística / prática recomendada / conjunto de regras para uma decisão entre a API de critérios e a NamedQuery ?

Meus pensamentos até agora:
As consultas nomeadas geralmente são mais legíveis.As consultas de critérios são mais flexíveis.
Ambos são pré-compilados.Costumo confiar no uso de consultas nomeadas por tanto tempo quanto possível e, em seguida, mudar para critérios.

Mas talvez o desejo de "flexibilizar" a consulta usando a API de critérios é uma dica para um design subótimo (ou seja, separação de interesses)?

Obrigado

Foi útil?

Solução

As consultas nomeadas são mais ideais (são analisadas / preparadas uma vez).As consultas de critérios são dinâmicas (não são pré-compiladas, embora alguns provedores JPA, como o EclipseLink, mantenham um cache de preparação de critérios).

Eu usaria critérios apenas para consultas dinâmicas.

Outras dicas

As consultas de critérios são uma boa opção quando uma consulta deve ser gerada dinamicamente, com base em variáveis e vários critérios de pesquisa, por exemplo.

Para consultas estáticas, JPQL é muito mais legível e prefiro usá-los do que consultas de critérios.Você pode perder um pouco de segurança, mas os testes de unidade devem deixá-lo mais confiante.

Outro ponto de vista é que embora a consulta de critérios não seja tão legível, é à prova de tipos, portanto, fornece verificação de tipo em tempo de compilação.Se você alterar o banco de dados em projetos onde há muitas entidades e muitas consultas, é realmente útil ver em tempo de compilação quais consultas deram errado por causa da mudança.

Por outro lado, não tenho certeza se isso é mais benéfico do que a simplicidade do JPQL

Na verdade, eu passei pela fonte Hibernate (4.3.0-SNAPSHOT) e pela fonte EclipseLink (2.5.0-SNAPSHOT) e examinei a implementação JPA em cada uma delas.

O EclipseLink claramente não é thread-safe da maneira que você descreve.Especificamente, ele tenta recalcular as junções repetidamente.

A implementação do Hibernate parece thread-safe para mim.Não tenho 100% de certeza, mas parece ter.Eu diria que não há garantia de que isso seja verdade no futuro, pois não é especificado.

No entanto, vou avisá-lo, não acho que você vai ganhar muito.Pelo que estou vendo, grande parte da compilação da consulta é realmente feita durante a fase "createQuery", então você nem mesmo ganharia muito armazenando os resultados em cache.

A JPA também fornece uma maneira de construir consultas estáticas, como consultas nomeadas, usando as anotações @NamedQuery e @NamedQueries.É considerado uma boa prática em JPA preferir consultas nomeadas em vez de consultas dinâmicas, quando possível.De http://www.objectdb.com/java/jpa/query/api

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