Criteria y HQL. Algunas diferencias

Algunas veces nos preguntamos las principales diferencias entre Criteria y HQL en Hibernate.

Aqui las mas importantes:

  • HQL lleva a cabo operaciones de tipo SELECT y NO-SELECT,  pero Criteria solamente trabaja con selección de datos, no podemos ejecutar consultas NO-SELECT en Criteria.
  • HQL es adecuado para ejecutar consultas estáticas, de lo cual Criteria es adecuado para consultas dinámicas.
  • HQL no soporta el concepto de paginación, pero Criteria los soporta directamente.
  • Criteria toma mas tiempo en ejecutar los procesos de consulta que HQL
  • Con Criteria estamos libres de SQL Injection porque genera querys dinámicas Pero en HQL con parámetros fijos podemos ser víctimas de SQL Injection.
Anuncios

Hibernate. Buscar texto utilizando criteria con case-insensitive y accent-insensitive

En Hibernate tenemos la opción de utilizar Criteria o HQL (en breve voy a realizar un comparativo).
En algún momento necesitaremos realizar búsquedas de campos de textos que ignoren acentos y mayúsculas.

En pocas líneas, podemos hacerlo en esta función genérica:


public List<T> getAll(String field,String value,Class<T> c) {

String parameter = Normalizer.normalize(value, Normalizer.Form.NFKD).replaceAll("\\p{InCombiningDiacriticalMarks}+", "");

//---

Criteria criteria = session().createCriteria(c);  //Obtener la session de Hibernate antes

List<T> results = new ArrayList<T>();

criteria.add(Restrictions.eq(field, parameter).ignoreCase());

results = (List<T>) criteria.list();

return results;

}

Vamos a comentarla:

La función Normalize nos eliminará los tildes. En esta entrada se explica mejor

En esta línea criteria.add(Restrictions.eq(field, parameter).ignoreCase());  tenemos la orden de ignorar las mayúsculas o minúsculas.

Todo armado con Criteria.

Simple pero útil código.

1- Genéricos. Potencial y abstracción en la programación moderna.

Cuando me viene a la mente cuales son los conocimientos mínimos esenciales para lograr escribir códigos potentes y limpios siempre agrego el uso de genéricos.
Saber aprovechar este tipo de abstracción nos potencia exponencialmente los algoritmos relacionados con objetos y sus instancias. Los objetos son mutables, moldeables y mucho mas.
La programación moderna nos exige usar genéricos, los frameworks lo utilizan e inclusive varios lenguajes de programación los soportan (ver este articulo que compara c# y Java).

Sólo para citar un ejemplo, imaginemos una clase generica del tipo DAO Pattern. Es muy simple imaginarnos la misma clase sin generics, quizás moldeando objetos en toda la aplicación.

Si desea ver ejemplos prácticos, en esta entrada podemos encontrar un ejemplo simple y concreto.

El desarrollo de software empresarial requiere muchas habilidades y sólo si dominamos la mayoría podemos estar en un mercado competente. El uso de genéricos es una de ellas.

MVVM en ZK dentro de un bucle forEach

ZK nos permite trabajar con patrones MVC y MVVM.
Quienes vienen de JSF están acostumbrados a manipular código cliente-servidor con EL, por lo tanto ZK nos permite hacer alunas cosas similares.
Por ejemplo, un evento onClick puede estar asociado directamente al método del JavaBean controlador.

El problema lo encontramos cuando iteramos y queremos enviar algún parámetro (ambas cosas son diferentes).

a) Iterar con <zk:forEach /> nos exige utilizar EL al estilo  ${each.orden}
b) Cuando enviamos al servidor, nos exige utilizar @command(‘funcion’,param=each) que no es lo mismo que el anterior. En pocas palabras ambos each no son el mismo objeto.

Solución:

<button  onClick="@command('funcion',paramID=self.getAttribute('paramID'))" >
    <custom-attributes paramID="${each.id}"/>
</button>

Esta solución simplemente muestra como obtener el valor de each dentro de un forEach para enviarlo a un @Command del servidor.

Algunas funciones en lenguaje EL (expression language)

EL es el lenguaje de expresiones del lado cliente en aplicaciones web J2EE.
En algunas ocasiones, necesitamos realizar pequeñas funciones client-side que las etiquetas “c”, “f” o similares no nos proveen.
Un pequeño pero útil Tag para manipular Strings u obtener cantidades en colecciones es:

/* JSP */
%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
/* JSF */
xmlns:fn="http://java.sun.com/jsp/jstl/functions"

Un ejemplo:

value=" #{fn:substring(sig.ask.toString(),fn:length(sig.ask.toString())"

En donde, en este caso invoca a la función substring( param, entero )

JavaDoc

Books: Fábricas de software: experiencias, tecnologías y organización

Este libro es una gran material para aquellos que desean desarrollar el concepto y ponerlo en práctica. Cuenta con ejemplos de empresas reales que revelan herramientas utilizadas, algunos clientes, tecnología que incorporan y recursos humanos. A propósito de las herramientas, podemos decir que una empresa de Software Factory necesita básicamente las siguientes herramientas o extensiones: * Control de versiones * Gestión documental * Normas de calidad * IDEs afines al desarrollo propuesto * Servidores * RRHH solvente * Marketing * Desarrollo dedicado a plataformas móviles.