Despues de un tiempo de descanso (del blog nada más!) obligado...en favor del Incentives Army...regreso para dar el penúltimo capítulo de la saga de "anécdotas" de Hibernate...saga que ha sido inspirada en el último proyecto terminado en JoeDayz, BSC.
Este episodio será dedicado a una de las mejores herramientas que tiene Hibernate: Criteria...en mi humilde opinión claro está u_u ...pero tambien espero poder hacerlo breve debido a que de este tema existen infinidad de información en la web.
Primero, qué es criteria? Bueno podriamos definirla como una especie de herramienta para realizar consultas a base de datos...una herramienta que difiere bastante de los modos anteriormente vistos (HQL y SQL).
Siguiendo con el mismo ejemplo de los anteriores posts usaremos la tabla DATA_DEMAND y su respectiva clase DataDemand.
En el primer post hablamos de como realizar querys dinámicos haciendo uso de HQL y como tendriamos orientarlos para evitar el engorro de las condicionales a usar. Para ello habiamos usado "1 = 1" para saltarnos no solo el hecho de usar el campo estado como primer filtro, sino tambien para armar fácilmente el query. Así:
[sourcecode language='java']
query.append(" from DataDemand ");
query.append(" where 1 = 1 "); <-------
if(coYear != null && coYear.length() > 0)
{
query.append(" and coYear = " + coYear);
}
if(coMonth != null && coMonth.intValue() > 0)
{
query.append(" and coMonth = " + coMonth);
}
if(coRegion != null && coRegion.intValue() > 0)
{
query.append(" and region.coRegion = " + coRegion);
}
if(coKpi != null && coKpi.length() > 0)
{
query.append(" and kpi.coKpi = '" + coKpi + "' ");
}
[/sourcecode]
Criteria no requiere ninguna especie de truco para hacer ello. Cómo? Así:
[sourcecode language='java']
DetachedCriteria criteria = DetachedCriteria.forClass(DataDemand.class);
if(coYear != null && coYear.length() > 0)
{
criteria.add(Restrictions.eq("coYear", coYear));
}
if(coMonth != null && coMonth.intValue() > 0)
{
criteria.add(Restrictions.eq("coMonth", coMonth));
}
if(coRegion != null && coRegion.intValue() > 0)
{
criteria.add(Restrictions.eq("region.coRegion", coRegion));
}
if(coKpi != null && coKpi.length() > 0)
{
criteria.add(Restrictions.eq("kpi.coKpi", coKpi));
}
criteria.add(Restrictions.eq("stDataDemand", "A"))
.addOrder(Order.desc("coYear"));
List list = getHibernateTemplate().findByCriteria(criteria);
[/sourcecode]
Lo primero que se observa es que se usa el objecto DetachedCriteria, en vez de usar session.createCriteria(DataDemand.class)...esto recuerden que se está desarrollando en una aplicacion con Spring =).
Luego de ello se observa el uso de Restrictions, esta clase nos permite usar operadores de igualdad y demás que se usan en los querys. Algunos de los filtros que le vamos agregando a nuestro query a través del método add de criteria podrian ser:
[sourcecode language='java']
Restrictions.eq(...,...)
Restrictions.in(..., coRegionList), donde coRegionList puede ser cualquier "derivado" de Collections...
Restrictions.between(...)
Restrictions.and(...,...)
Restrictions.isEmpty(...)
Restrictions.isNotEmpty(...)
Restrictions.isNotNull(...)
Etc...
[/sourcecode]
Para el caso del uso de funciones tales como MAX y MIN se debe hacer uso de ProjectionList, por ejemplo:
[sourcecode language='java']
ProjectionList projectionList = Projections.projectionList()
.add(Projections.max("coYear"));
[/sourcecode]
Y luego agregar el projectionList:
[sourcecode language='java'] criteria.setProjection(projectionList);
[/sourcecode]
A primera vista no se ve muy diferente, sin embargo podria decir que el código me parece más limpio, más directo y más elegante =P...hablando a nivel de querys orientados a objectos me refiero.
El nivel y la cantidad de métodos que nos ofrece esta librería es bastante grande. En las pruebas que he realizado ha sido la mejor cuando se trata de armar querys dinámicamente. Querys en los que se requiera mostrar la mayor parte de los atributos de los objecto obtenidos. Esto ya que siempre se requiere tener cuidado en el mapeo de los objectos como vimos en el Episodio II.
El siguiente post por fin espero cerrar esta saga con una breve comparativa entre los tipos de consultas a base de datos antes presentados.
Saludos, hasta la próxima.
Vq1b64 pzkptkhzsxzu, [url=http://wcvfyagbrwwn.com/]wcvfyagbrwwn[/url], [link=http://hyszpuyudrds.com/]hyszpuyudrds[/link], http://uzxukvdlvadf.com/
ResponderEliminar?????.
ResponderEliminar???????.
ResponderEliminar??????? ? ????????, ???????!
ResponderEliminar"??????? ?? ????? ????"
ResponderEliminar???? ?????? ?????????????, ???????????? ???????!
ResponderEliminar"????????? ? ?????????????"
ResponderEliminarha ))
ResponderEliminar???????? ??????. ?? ??????.
ResponderEliminar?? ??? ????? ?????? ??? ?? ?????. ? ?? ???? ????????? ???????. ?????? ?????? ??? ????? ????? ??? ?? ??? ?????????? ????? :)
ResponderEliminar"??? ???? ? ???? ? ?????????"
ResponderEliminar???????? ????,????????? ?????
ResponderEliminar??? ?????????, ??? ????????? ?? ?????? :D
ResponderEliminarCasino 1250184214...
ResponderEliminarCasino 1250184214...
?? ?????? ????? ?????? ??? ????? ?? ?????? ????????, ????? ??????? ??????, ? ?? ?????????? ???????? ???????? ???!
ResponderEliminar???????????!!!
ResponderEliminar????????? ???????????? ???? ?????.
ResponderEliminar???????? ? ????? ?????? ?? ?????.
ResponderEliminar