Pregunta

¿Existe una heurística / mejores prácticas / conjunto de reglas para tomar una decisión entre la API de criterios y NamedQuery ?

Mis pensamientos hasta ahora:
Las consultas con nombre son generalmente más legibles.Las consultas de criterios son más flexibles.
Ambos están precompilados.Tiendo a confiar en el uso de consultas con nombre el mayor tiempo posible y luego cambiar a criterios.

Pero tal vez ¿La necesidad de "flexibilizar" la consulta mediante el uso de la API de criterios es un indicio de un diseño subóptimo (es decir, separación de preocupaciones)?

Gracias

¿Fue útil?

Solución

Las consultas con nombre son más óptimas (se analizan / preparan una vez).Las consultas de criterios son dinámicas (no están precompiladas, aunque algunos proveedores de JPA como EclipseLink mantienen una caché de preparación de criterios).

Usaría criterios solo para consultas dinámicas.

Otros consejos

Las consultas de criterios son una buena opción cuando una consulta debe generarse dinámicamente, basada en variables y múltiples criterios de búsqueda, por ejemplo.

Para consultas estáticas, JPQL es mucho más legible y prefiero usarlas que las consultas de criterios.Podría perder algo de seguridad, pero las pruebas unitarias deberían darle más confianza.

Otro punto de vista es que, aunque la consulta de criterios no es tan legible, es segura para los tipos, por lo que le proporciona una verificación de tipos en tiempo de compilación.Si cambia la base de datos en proyectos donde hay muchas entidades y muchas consultas, es realmente útil ver en el momento de la compilación qué consultas fallaron debido al cambio.

Por otro lado, no estoy seguro de que sea más beneficioso que la sencillez de JPQL

De hecho, revisé la fuente de Hibernate (4.3.0-SNAPSHOT) y la fuente de EclipseLink (2.5.0-SNAPSHOT) y revisé la implementación de JPA en cada una.

EclipseLink claramente no es seguro para subprocesos de la manera que usted describe.Específicamente, intenta recalcular las combinaciones repetidamente.

La implementación de Hibernate me parece segura para subprocesos.No estoy 100% seguro, pero parece que sí.Yo diría que no se garantiza que esto sea cierto en el futuro, ya que no se especifica.

Sin embargo, te advertiré que no creo que vayas a ganar mucho.Por lo que estoy viendo, gran parte de la compilación de la consulta se realiza realmente durante la fase "createQuery", por lo que ni siquiera obtendría mucho almacenamiento en caché de los resultados.

JPA también proporciona una forma de crear consultas estáticas, como consultas con nombre, utilizando las anotaciones @NamedQuery y @NamedQueries.Se considera una buena práctica en JPA preferir consultas con nombre sobre consultas dinámicas cuando sea posible.De http://www.objectdb.com/java/jpa/query/api

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