java - mediante - spring framework pdf español
JPA llamada consultas contra API de criterios? (5)
¿Existe una heurística / mejores prácticas / conjunto de reglas para una decisión entre Criteria API 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 a los criterios.
Pero tal vez el impulso de "flexibilizar" la consulta mediante el uso de la API de criterios es una pista para el diseño subóptimo (es decir, la separación de las preocupaciones)?
Gracias
De hecho, fui a través de la fuente Hibernate (4.3.0-SNAPSHOT) y la fuente EclipseLink (2.5.0-SNAPSHOT) y analicé la implementación de JPA en cada una de ellas.
EclipseLink claramente no es seguro para subprocesos de la manera que usted describe. Específicamente, intenta volver a calcular uniones repetidamente.
La implementación de Hibernate me parece segura. No estoy 100% seguro, pero parece ser así. Diría que no se garantiza que esto sea cierto en el futuro ya que no está especificado.
Sin embargo, te advertiré, no creo que vayas a ganar mucho. Según lo que estoy viendo, gran parte de la compilación de la consulta se realiza en realidad 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 generar consultas estáticas, como consultas con nombre, utilizando las anotaciones @NamedQuery y @NamedQueries. Se considera que es una buena práctica en JPA preferir las consultas con nombre sobre las consultas dinámicas cuando sea posible. De http://www.objectdb.com/java/jpa/query/api
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 un caché de preparación de criterios).
Usaría criterios solo para consultas dinámicas.
Las consultas de criterios son una buena opción cuando se debe generar dinámicamente una consulta, basada en criterios de búsqueda variables y múltiples, por ejemplo.
Para las consultas estáticas, JPQL es mucho más legible, y prefiero usarlas que las consultas de criterios. Podrías perder algo de seguridad, pero las pruebas de la unidad deberían darte más confianza.
Otro punto de vista es que, aunque la consulta de criterios no es tan legible, es segura, por lo tanto, le proporciona la verificación del tipo de tiempo de compilación. Si cambia la base de datos en proyectos donde hay muchas entidades y muchas consultas, es realmente útil ver en tiempo de compilación qué consultas fallaron debido al cambio.
Por otro lado, no estoy seguro de que sea más beneficioso que la simplicidad de JPQL