java - namedquery - jpa named query parameters
@NamedQuery sobre @NamedNativeQuery (3)
¿Hay algún beneficio de usar @NamedQuery
sobre @NamedNativeQuery
en hibernación o viceversa? No puedo detectar la diferencia exacta o en qué contexto debemos usar @NamedQuery
sobre @NamedNativeQuery
Gracias por adelantado.
Cuando te dedicas al rendimiento, debes saber algo sobre lo que ocurre debajo del capó.
Probablemente haya programado algo utilizando JDBC sencillo, de modo que sepa cómo se pasan las consultas al controlador y se envían a la base de datos. Cuando se utiliza HQL o JPA-QL, las consultas primero deben analizarse en un lenguaje SQL que la base de datos pueda comprender. En este caso, tenemos un paso de análisis adicional en el medio. Tenga en cuenta que las consultas SQL nativas, incluidas las llamadas a procedimientos almacenados, el marco de persistencia aún se encarga de asignar los conjuntos de resultados JDBC a los gráficos de objetos persistentes.
Si desea incluir una sugerencia de SQL nativa para instruir al optimizador de consultas de los sistemas de administración de bases de datos, por ejemplo, debe escribir el SQL usted mismo. HQL y JPA-QL no tienen palabras clave para esto.
La desventaja de poner SQL nativo en sus metadatos de mapeo es la pérdida de la portabilidad de la base de datos, ya que sus mapeos y, por lo tanto, su aplicación, funcionarán solo para una base de datos particular. Pero generalmente esto es de poca importancia ya que probablemente no esté creando un marco que tenga que funcionar en todas las bases de datos.
Cuando quiera respaldar el rendimiento de su consulta, realmente tiene que consultar la base de datos y observar el plan de ejecución. Un DBA puede decirle exactamente qué es bueno y qué se puede optimizar.
@NamedNativeQuery
permite escribir una consulta SQL nombrada, mientras que @NamedQuery
permite escribir una consulta HQL nombrada (o JPQL).
En general, debería preferir escribir consultas HQL porque entonces puede dejar que Hibernate maneje las complejidades de convertir el HQL en los diversos dialectos de SQL. Esto hará que su trabajo sea mucho más sencillo cuando elija cambiar de proveedor de DBMS.
@NamedQuery
debe construirse con el lenguaje de consulta (HQL o lenguaje de consulta de persistencia). @NamedNativeQuery
debe construirse con SQL nativo.