Criteria vs HQL

533 views
Skip to first unread message

Valentin Palacios

unread,
Feb 23, 2012, 10:32:34 AM2/23/12
to jav...@googlegroups.com
Buenas,

Estoy leyendo documentación sobre Hibernate y no termina de quedarme claro en el tema de las consultas, cuando usar Criteria y cuando usar HQL. Dicen que para consultas dinámicas es mejor usar Criteria y para consultas estáticas es mejor usar HQL.

Desde el punto de vista del desarrollo web yo lo veo todo "estático". Cuando un cliente realiza la petición, cuando llega al servidor tengo todos los datos y con HQL y setParameters puedo realizar la consulta. En aplicaciones de escritorio igual, si un usuario rellena un campo de texto y luego pulsa el botón de buscar, puedes obtener la información de dicho campo y meterlo como parámetro en la consulta HQL.

De momento solo estoy leyendo un libro a cerca de Hibernate y Spring, pero es que no acabo de ver cuando usar Criteria.

¿Me podrían dar algún ejemplo para ver si acabo de entenderlo?


Saludos y gracias.

Luis Alejandro Santana

unread,
Feb 23, 2012, 12:14:39 PM2/23/12
to jav...@googlegroups.com
Buenas Tardes Valentin,

El tema de las consultas e interacciones con la base de datos es posible por muchas vías.  Consultas en HQL, en NativeSQL, en Criteria, en Views mapeados por Annotations o por el hbm.xml, etc.

Con respecto a estos dos casos que mencionas, Criteria y HQL,  Criteria es una forma de hacer las mismas consultas que puedes realizar con HQL o con NativeSQL, solo que te las presenta en forma de clases y métodos que puedes utilizar de forma mas elegante, en otro punto, el uso de Criteria es amigable, y no necesitas saber SQL para manejarlo.  Con Criteria puedes utilizar muchas expresiones (Expressions), restricciones (Restrictions), ordenamiento (Order), etc.  Con respecto a si es estático o dinámico, las consultas en sí son estáticas, dado que, aún pasandole parámetros, igual te devolverá un resultado específico.  Hay formas avanzadas de manejo de consultas dinámicas, pero ese no es el tema ahora.

Sugerencia: si sabes SQL, es recomendable ejecutar tus consultas via HQL o NativeSQL en hibernate, así te evitas que hibernate cree objetos en el Heap para las clases de Criteria, y a su vez, agregas performance a las consultas.  Claro, el performance influye en toda la configuración de hibernate y en como manejes los recursos de la aplicación


He aquí TODO lo que necesitas saber de hibernate.  La documentación de JBOSS.

Siempre a la orden.

Saludos,

--
www.JavaSOS.com
Grupo de colaboración Java/J2ee para desarrolladores de habla hispana.



--

Luis Alejandro Santana Valdez

Consultor Técnico-Funcional SAP  -  Desarrollador JAVA

Cel. 829-301-7407


Giovanny Vélez

unread,
Feb 23, 2012, 12:20:28 PM2/23/12
to jav...@googlegroups.com, Valentin Palacios
Hola Valentín:

Un ejemplo particular en el que uso Criteria es el siguiente:

Tengo una aplicación CRM en la cual se muestran las listas de oportunidades de negocio de acuerdo con el perfil de usuario y, en algunos casos, del país de residencia. Entonces:
-Si el usuario es administrador puede ver todas las oportunidades de todos los vendedores de todos los países.
-Si es supervisor de ventas, puede ver todas las oportunidades de sus vendedores asignados.
-Si es supervisor regional, puede ver todas las oportunidades de su país.
-Si es vendedor, solo puede ver sus oportunidades.

Si tuviera que hacer un JPQL o HQL en este caso, tendría que componer el string de consulta de acuerdo con los casos (especialmente en el WHERE de la consulta) y agregarlo en los NamedQuery de la Entidad o podría hacer un JPQL en tiempo de ejecución con el string resultante.

Personalmente me parece muy engorroso, mientras que con Criteria puedo construir el query de acuerdo con el caso y el query se compone dinámicamente.

Espero que sea un caso ilustrativo.

Saludos,


Giovanny


El 23/02/12 10:32, Valentin Palacios escribió:

Valentin Palacios

unread,
Feb 23, 2012, 2:18:01 PM2/23/12
to Giovanny Vélez, jav...@googlegroups.com
Gracias a los dos, me va quedando algo más claro.

2012/2/23 Giovanny Vélez <giovanny...@gmail.com>

Luis Alejandro Santana

unread,
Feb 23, 2012, 7:36:20 PM2/23/12
to jav...@googlegroups.com
Siempre a la orden.
 
Saludos,

2012/2/23 Valentin Palacios <valentin...@gmail.com>
Reply all
Reply to author
Forward
0 new messages