He estado leyendo algunos contesta, pero todavía estoy confundido. ¿Por qué? debido a que las diferencias que se han mencionado no se relacionan con el rendimiento. están relacionados con el uso fácil.(Objetc(criterios) y SQL(hql)). Pero me gustaría saber si «criterios» es más lento que hql por alguna razón.

Leí esto en otro contesta

«Hay una diferencia en términos de rendimiento entre HQL y criteriaQuery, cada vez que el fuego de una consulta con criteriaQuery, se crea un nuevo alias para el nombre de la tabla que no se reflejan en la última consulta de caché para cualquier DB. Esto conduce a una sobrecarga de compilar el código SQL generado, teniendo más tiempo para ejecutar.» por Varun Mehta.

Esto está muy cerca de PERO! he leído en otro sitio(http://gary-rowe.com/agilestack/tag/hibernate/) Este no es el caso con Hibernate 3.3 y por encima(por favor leer esto: 9) Hibernate es lento porque el SQL generado por los Criterios de la interfaz no es consistente)

He hecho unas pruebas, tratando de encontrar las diferencias, pero ambos generan consulta y no cambiar el alias de la tabla.

Estoy muy confundido. Si alguien sabe la razón principal por favor, nos podría ayudar. Gracias

InformationsquelleAutor kcobuntu | 2010-12-09

5 Comentarios

  1. 141

    Yo soy el hombre que escribió el 3 de Hibernación de consulta traductor en 2004, por lo que yo sé algo acerca de cómo funciona.

    Criterios, en teoría, debería tener menos sobrecarga que una consulta HQL (excepto para las consultas con nombre, que voy a llegar). Esto es debido a que los Criterios no necesita analizar nada. Consultas HQL se analiza con un ANTLR de analizador y, a continuación, el resultado de la AST se convirtió en SQL. Sin embargo, con HQL/JPAQL puede definir consultas con nombre, donde el SQL se genera cuando el
    SessionFactory se inicia. En teoría, las consultas con nombre tienen menos gastos generales de Criterios.

    Así, en términos de SQL-generación de sobrecarga tenemos:

    1. Llamado HQL/JPAQL Consulta SQL de la generación que sucede sólo una vez.
    2. Criterios – No hay necesidad de analizar antes de generar.
    3. (sin nombre) HQL/JPAQL Consulta – Analizar, a continuación, generar.

    Que dijo, la elección de una consulta técnica que se basa en la sobrecarga de análisis y generación de SQL es probablemente un error en mi opinión. Esta sobrecarga es normalmente muy pequeña en comparación con la realización de una consulta real en un verdadero servidor de base de datos con datos reales. Si esta sobrecarga se muestran cuando el perfil de la aplicación, a continuación, tal vez usted debe cambiar a una consulta con nombre.

    Aquí están las cosas que considerar al momento de decidir entre Criterios y HQL/JPAQL:

    • En primer lugar, usted tiene que decidir si usted está ACEPTAR con tener un dependencia de Hibernate-de propiedad de la API de en el código. JPA no tiene Criterios.
    • Criterios es realmente muy bueno en el manejo de muchas opcional parámetros de búsqueda tal como se puede encontrar en una página web normal con un multi-parámetro de ‘la búsqueda de la forma». Con HQL, los desarrolladores tienden a añadir expresiones de la cláusula where con StringBuilder (evitar esto!). Con los Criterios, usted no necesita hacer eso. Hardik publicado opiniones similares.
    • HQL/JPAQL puede ser utilizado para la mayoría de las otras cosas, porque el código tiende a ser más pequeño y más fácil para los desarrolladores a entender.
    • Muy frecuentes las consultas pueden ser convertidos en consultas con nombre si utiliza HQL. Yo prefiero hacer esto más tarde, después de algunos perfiles.
    • JPA doesn't have Criteria ?
    • Como de JPA 2.x, no. SI MAL NO RECUERDO, JPA 1.x no.
    • Excelente explicación. Sólo quiero saber por qué debemos evitar el uso de StringBuilder para la construcción de HQL. Qué hacer con los parámetros opcionales, por ejemplo?
    • Si usted está construyendo JPAQL/HQL por cadena concatentation, entonces es muy probable que usted tiene una consulta dinámica y eso es lo que los Criterios de la consulta de una función para. Yo tiendo a usar Criterios para nada dinámico (por ejemplo, la consulta varía mucho dependiendo de la entrada del usuario). HTH – Josh
  2. 9

    Estoy trabajando en millones de registro. He encontrado HQL es mucho más rápido que los Criterios. Criterios gal mucho en el rendimiento.

    Si se trata de gran cantidad de datos, a continuación, ir a por HQL.

    • Esto no tiene mucho sentido para mí. Si tienes un gran conjunto de datos, entonces la mayoría del tiempo se dedica a la espera de la base de datos para procesar la consulta. El tiempo que se tarda en generar el SQL de HQL o a partir de Criterios no es importante en ese caso. La única vez que el uso de JPAQL consultas con nombre vs ‘recto’ JPAQL vs Criterios es cuando usted está haciendo la misma consulta muchos veces. El tamaño del conjunto de datos no importa en absoluto.
    • Puede ser que usted no ha utilizado Criterios en el sentido correcto. O se ha creado una nueva Criterios objeto de Consulta para cada uno de sus millones de registros?
    • Tal vez el plan de acceso de SQL generado es diferente. Esto no significa que es Criterio de la culpa.
  3. 5

    Otras Ventajas creo que para los Criterios de más de HQL:

    Escrito HQL hace que el código desordenado.
    No parece escrito limpio Orientado a Objetos de Código más.

    Durante la escritura de los Criterios de las Consultas, el IDE nos sugiere con Intellisense, por lo que hay menos posibilidades de cometer errores, excepto cuando escribimos algo como nombres de variable en comillas dobles.

    • Para consultas complejas, HQL es mucho más legible que Criterios.
  4. 4

    Que en su mayoría prefieren los Criterios de las Consultas para consultas dinámicas. Por ejemplo, es mucho más fácil añadir algunos pedidos de forma dinámica o dejar algunas partes (por ejemplo, restricciones) dependiendo de algunos parámetros.

    Por otro lado estoy usando HQL para la estática y consultas complejas, porque es mucho más fácil de entender y leer HQL. También, HQL es un poco más potente, creo que, por ejemplo, para los diferentes tipos de combinación.

    JPA e Hibernate – Criterios vs JPQL o HQL

    • Los criterios pueden hacer la mayoría de los tipos de combinación que HQL puede hacer, aunque a veces es un poco incómodo o difícil de entender (al menos en mi opinión). Toda la razón acerca de HQL de ser más fácil de leer!
    • Por CIERTO, yo iba a votar por tu respuesta… pero en realidad no respuesta kcobuntu pregunta.
    • Si te vas a copiar de alguien más respuesta que usted debe por lo menos mencionarlo. Enlace a la original respuesta: stackoverflow.com/a/197496/980103
    • Bueno..yo era un novato y no teníamos muchos usuarios/moderadores en TAN.
  5. 3

    Que están bien y que no.
    Lista de resultados se recuperan de la base de datos o caché con el org.hibernate.loader.Loader clase. Cuando la caché no está habilitada, la instrucción preparada construir utilizando el Dialecto objeto que se crea en SessionFactoryImp. Así, las declaraciones, ya sea inicializado por la lista de llamadas.
    Además, el bajo nivel de consulta se genera automáticamente. Básicamente, es una ayuda, pero no puede ser un caso cuando una consulta específica será más eficaz cuando está escrito manualmente.

Dejar respuesta

Please enter your comment!
Please enter your name here