martes, 23 de agosto de 2011

Criteria: Combinando AND y OR en Hibernate

Seguramente en tus sistemas te has encontrado que tienes que hacer consultas con Hibernate que impliquen tener fija una condición y agregar varios criterios OR.

Vamos a suponer que tenemos una tabla con los siguientes campos

Producto(idProducto, nombreProducto, idProveedor, precio, categoria)

Y necesitas obtener los productos del proveedor "PR001" Y que el nombreProducto contenga "Computadora" O que el precio sea mayor a 1000 O que la categoria sea "PC", para lograrlo puedes hacer lo siguiente:

// creamos el criterio
Criteria criteria = session.createCriteria(Producto.class);

// Primero creamos el criterio fijo
Criterion critIdProveeodr = Restrictions.eq("idProveedor", "PR001");

// luego preparamos los OR
Disjunction disjunctionOrs = Restrictions.disjunction();

// y agregamos cada uno
disjunctionOrs.add(Restrictions.like("nombreProducto","Computadora",MatchMode.ANYWARE));
disjunctionOrs.add(Restrictions.gt("precio",1000));
disjunctionOrs.add(Restrictions.eq("categoria","PC"));

// creamos la combinación AND y OR
criteria.add( Restrictions.and(cridIdProveedor,disjunctionOrs));

// y por último los listamos
criteria.list();


Espero les sea de utilidad



viernes, 15 de julio de 2011

Nueva versión para generar Reporte en HTML de un modelo en MySQLWorkBench


Hace tiempo publiqué la forma de generar la documentación en HTML de una base de datos con la herramienta MySQLWorkBench. La versión inicial solo obtenía la información de las tablas.

Gracias al trabajo de Abraham Marcelino RamírezVega, ahora es posible obtener la documentación de las vistas y de los procedimientos almacenados.

Aquí les dejo la versión modificada con los cambios de Abraham:


local schemata= grtV.getGlobal("/wb/doc/physicalModels/0/catalog/schemata/1/tables")
local i
local j

print("Tablas\n" )
for i=1, grtV.getn(schemata) do

print("<HR><table border='1' style='width:100%'> \n" )
print("<tr><td colspan='5'> Nombre de la tabla: " .. schemata[i].name .. "</td></tr> \n")
print("<tr><td colspan='5'> Descripcion: " .. schemata[i].comment .. "</td> </tr>\n")
print("<tr> \n" )
print("<td>NOMBRE DE COLUMNA</td> \n")
print("<td>TIPO</td> \n")
print("<td>NULO</td> \n")
print("<td>AUTO INCRMENTAL</td> \n")
print("<td>COMENTARIOS</td> \n")
print("</tr> \n" )

for j=1, grtV.getn(schemata[i].columns) do
print("<tr> \n" )
print ( " <td>" .. schemata[i].columns[j].name .. "</td> \n" )
print ( " <td>" .. schemata[i].columns[j].formattedType .. "</td> \n" )

if (schemata[i].columns[j].isNotNull == 1) then
print (" <td>" .. "NOT NULL" .. "</td> \n" )
else
print ( " <td>" .. "NULL" .. "</td> \n" )
end

if (schemata[i].columns[j].autoIncrement == 1) then
print (" <td>" .. "AUTO_INCREMENT" .. "</td> \n" )
else
print (" <td>" .. " - " .. "</td> \n" )
end

print ( " <td>" .. schemata[i].columns[j].comment .. "</td>\n</tr>\n" )
end
print("</table>\n" )
end


print("<HR><Vistas\n" )
schemata= grtV.getGlobal("/wb/doc/physicalModels/0/catalog/schemata/1/views")
for i=1, grtV.getn(schemata) do

print("<HR><table border='1' style='width:100%'> \n" )
print("<tr><td colspan='5'> Nombre de la vista: " .. schemata[i].name .. "</td></tr> \n")
print("<tr><td colspan='5'> Descripcion: " .. schemata[i].comment .. "</td> </tr>\n")
print("<tr><td colspan='5'> Definicion de la vista:</td></tr><tr><td>" .. schemata[i].sqlDefinition .. "</td> </tr>\n")
print("</table>\n" )

end

print("Procedimientos Almacenados\n" )
schemata= grtV.getGlobal("/wb/doc/physicalModels/0/catalog/schemata/1/routines")

for i=1, grtV.getn(schemata) do
print("<HR><table border='1' style='width:100%'> \n" )
print("<tr><td colspan='5'> Nombre del procedimiento almacenado: " .. schemata[i].name .. "</td></tr> \n")
print("<tr><td colspan='5'> Typo del procedimiento almacenado: " .. schemata[i].routineType .. "</td></tr> \n")
print("<tr><td colspan='5'> Descripcion: " .. schemata[i].comment .. "</td> </tr>\n")
print("<tr><td colspan='5'> Parametros: </td> </tr>\n")
print ( "<tr>\n<td>Nombre del parametro</td>\n" )
print ( "<td>Tipo de dato del parametro</td>\n</tr>" )

for j=1, grtV.getn(schemata[i].params) do
print ( "<tr><td>" .. schemata[i].params[j].name .. "</td>" )
print ( "<td>" .. schemata[i].params[j].datatype .. "</td></tr>\n" )
end

print("<tr><td colspan='5'> Definicion del procedimiento almacenado:</td></tr>\n")
print("<tr><td colspan='5'>" .. schemata[i].sqlDefinition .. "</td></tr>\n")
print("</table>\n" )
end