2010-04-15 11 views
6

Un nuevo colega acaba de sugerir el uso de consultas HQL con nombre en Hibernate con anotaciones (es decir, @NamedQuery) en lugar de incrustar HQL en nuestras clases de XxxxRepository.¿Están Hibernate denominadas consultas HQL (en anotaciones) optimizadas?

Lo que me gustaría saber es si el uso de la anotación proporciona alguna ventaja a excepción de la centralización de consultas?

En particular, ¿hay alguna ganancia de rendimiento, por ejemplo, porque la consulta solo se analiza una vez cuando se carga la clase en lugar de cada vez que se ejecuta el método Repository?

+0

y prefiero consultas de criterios a ambos ... – NimChimpsky

Respuesta

8

de Pro EJB 3 (Mike Keith):.

" ... recomendamos consultas con nombre siempre que sea posible persistencia proveedores a menudo tomarán medidas para PRECOMPILE JPQL nombrado consultas a SQL como parte de la implementación o inicialización fase de una aplicación ".

Aunque este libro está en JPA, el consejo general se aplica a Hibernate. Sin embargo, dado que Hibernate almacena en caché HQL/JPQL, probablemente no verá una gran ganancia de rendimiento. Otra ventaja de usar consultas con nombre es que le da la opción de anular una consulta utilizando un archivo de asignación en el momento del despliegue sin tener que reconstruir su aplicación; útil si necesita ajustar una consulta en producción.

5

Además de cualquier ganancia de rendimiento posible, creo que otra ventaja sería que al usar consultas HQL con anotaciones, puede protegerse de los ataques de inyección de SQL.

Para una aplicación web, esto es importante si la consulta contiene datos de entrada del usuario. comentario

http://en.wikipedia.org/wiki/SQL_injection

3

Lars' con respecto a la inyección de SQL puede inducir a error, aunque no creo que era su intención, y quería dar un poco más de contexto para que el comentario no es mal interpretado.

Es cierto que las consultas con nombre se parametrizan por especificación, y el uso de parámetros con nombre es un paso en la protección contra la inyección de SQL. Sin embargo, no protege completamente contra la inyección de SQL (consulte su enlace para obtener más información). La redacción del comentario sugiere que el uso de consultas con nombre es el único paso necesario para protegerse contra los ataques de inyección. En realidad, las consultas normales pueden (y deben) ser parametrizadas y proporcionarán exactamente el mismo nivel de aislamiento del ataque de inyección que las consultas con nombre, y la parametrización de sus consultas es solo uno de los pasos necesarios para frustrar los ataques de inyección. Para agregar al comentario de Lars sobre webapps, tenga en cuenta que es importante eliminar los datos para proteger contra ataques de inyección independientemente de si la aplicación está orientada externamente o no, o si los datos de entrada provienen de un usuario o de otra base de datos (o incluso la misma base de datos).

2

Personalmente, creo que la ganancia de rendimiento es menos importante que el hecho de que las consultas hql se analizan durante el inicio del servidor, proporcionándole mensajes instantáneos si su consulta hql es incorrecta.

Prefiero detectar estos errores antes de las pruebas en lugar de durante.

La última vez, durante las pruebas, me encontré con una consulta en el código que no funcionaba, de hecho nunca funcionó, debido a CaSiNg. Esto se habría puesto de manifiesto inmediatamente durante el inicio del servidor, al usar consultas con nombre.

Y, por supuesto, no me gusta tener mi HQL mezclado con el código de Java.

Cuestiones relacionadas