miércoles, 20 de mayo de 2015

Criteria Hibernate

El uso de criterios en Hibernate para consultas avanzadas

 En Hibernate, el API Criterios nos ayuda a construir objetos de consulta criterios dinámicamente. Criterios es una otra técnica de recuperación de datos, aparte de HQL y consultas SQL nativas. La principal ventaja de la API de criterios es que está intuitivamente diseñado para manipular los datos sin necesidad de utilizar ninguna de las declaraciones de SQL no modificables. Comportamiento programático ofrece comprobación de sintaxis en tiempo de compilación; como resultado, la mayoría de los mensajes de error se entregan durante la compilación. Aunque es conveniente, esto no proporciona ninguna capacidad de mejorar el rendimiento en HQL o consultas SQL nativas. De hecho, se trata de una preferencia a los desarrolladores para elegir según el gusto y necesidad. Usted puede utilizar los tres o un palo a uno. Vamos a ver si podemos encontrar algunos ejemplos para apreciar la API de criterios de consulta.

Empezando

 La interfaz org.hibernate.Criteria define varios métodos para crear objetos de consulta mediante programación. Generalmente usamos un objeto Session para llamar al método createCriteria () y crear un objeto Criteria. Antes de entrar en las manos, vamos a crear algunas clases de utilidad para probar los ejemplos en la línea.

 Podemos usar el siguiente código para crear un objeto de criterios. Este criterio devolverá la lista de proveedores disponibles en la base de datos

Criterios Criterios = session.createCriteria (Supplier.class); Lista <Proveedor> proveedores criteria.list = ();

Una vez que esto se ejecuta, se obtiene una lista de la instancia del proveedor. Entonces, podemos recorrer la lista para obtener sus datos, tales como:

para la (s Proveedor: proveedores) {
    System.out.println (s.toString);
 }
 

Criterios con Restricciones

Para aventar por el resultado de nuestras consultas, podemos añadir un poco de restricción mediante el uso de los métodos estáticos proporcionados por la clase org.hibernate.criterion.Restrictions. Podemos establecer una o más restricciones para limitar el resultado a un objeto Criteria con el método add. Por ejemplo, podemos utilizar la ecuación y / o como método para recuperar los objetos que tienen un valor de propiedad que es igual a nuestra restricción.

 Criterios c2 = session.createCriteria (producto de clase.);
 c2.add (restricciones similares ("nombre", "INC").);
 c2.add (restricciones similares ("Descripción", "% Transporte%").);
 

La coincidencia de patrones también se puede hacer con la enumeración proporcionada por el objeto de la rg.hibernate.criterion.MatchMode, tales como:


  • START: Coincide con el comienzo de la cadena
  • END: Coincide con el final de la cadena
  • EXACTA: Coincide exactamente con la cadena
  • EN CUALQUIER LUGAR: Coincide con cualquier parte de la cadena
 Criterios c2 = session.createCriteria (producto de clase.);
 c2.add (Restrictions.ilike ("Descripción", "incubadora",
    . MatchMode FIN));
 
 
ilike () es una variación entre mayúsculas y minúsculas de los similares.  Para 
recuperar los valores NULL de la base de datos, se debe utilizar la restricción  
isNull (). 
  Criterios c2 = session.createCriteria (producto de clase.);
 c2.add (Restrictions.isNull ("descripción"));
Para encontrar productos cuyo precio es mayor que, por ejemplo $ 8000, utilice la siguiente:
Criterios c2 = session.createCriteria (producto de clase.); c2.add (Restrictions.gt ("precio", nuevo doble (8000.0)); Podemos escribir consultas más complejas utilizando las lógicas Y O limitaciones, tales como
Criterios c2 = session.createCriteria (producto de clase.); c2.add (Restrictions.gt ("precio", nuevo doble (8000.0)); c2.add (Restrictions.ilike ("Descripción", "incubadora", MatchMode FIN).); 2.Add (restricciones similares ("nombre", "EN%").); LogicalExpression Lógico = Restrictions.or ("nombre", "descripción"); c2.add (Lógico); Lista <Producto> list = c2.list ();

Conjunto de resultados de paginación

Un conjunto de resultados devuelto por la consulta de base de datos se puede configurar para paginación. Paginación establece el límite de nuestra vista en la lista del resultado. Tenemos más podemos navegar hacia adelante y hacia atrás a través de los resultados. Esto es particularmente útil por razones de rendimiento, especialmente cuando una consulta devuelve una lista grande de datos.
Criterios c2 = session.createCriteria (producto de clase.); c2.setFirstResult (10); c2.setMaxResults (50)

Clasificación Resultados de la consulta

Con frecuencia tenemos que ordenar la lista de datos que devuelve el conjunto de resultados. Lo hacemos de la siguiente manera:
Criterios c2 = session.createCriteria (Proveedor de clase.); c2.addOrder (Order.desc ("nombre"));

La obtención de un resultado único

Para obtener un resultado único del conjunto de resultados, utilice este código:
Criterios c2 = session.createCriteria (producto de clase.); c2.add (Restricciones le ("precio", nuevo doble (8000.0)).); c2.setMaxResults (1); Producto = (Producto) c2.uniqueResult ();

Asociaciones

Podemos unir dos o más clases de asociados para obtener un resultado. La asociación puede ser uno-a-uno, uno-a-muchos o muchos-a-uno. Supongamos que queremos encontrar el nombre de los proveedores que venden productos con un precio de más de $ 7.000. La consulta sería como sigue:
Criterios c2 = session.createCriteria (Proveedor de clase.); Criterios c3 = c2.createCriteria ("productos"); c3.add (. Restricciones ge ("precio", nuevo doble (7000.0))); Lista <Proveedor> list = c2.list ();

Proyecciones y Agregados

Hibernate soporta propiedades, funciones de agregado, y la cláusula GROUP BY. La clase de proyección es muy similar a la restricción. También proporciona varios métodos de fábrica estáticos para obtener instancias de proyección. El siguiente ejemplo muestra algunas de las funciones de agregado, junto con la proyección.
Criterios c2 = session.createCriteria (producto de clase.); ProjectionList projectionList = Projection.projectionList (); projectionList.add (Porjections min ("precio").); projectionList.add (. Porjections máximo ("precio")); projectionList.add (Porjections avg ("precio").); projectionList.add (Porjections.countDistinct ("nombre")); c2.setProjection (projectionList); Lista <Proveedor> list = c2.list ();

QBE: consulta por ejemplo

En QBE, podemos rellenar una instancia y utilizarlo como una plantilla. Los valores que figuran en la instancia se pueden utilizar para construir los criterios. En Hibernate QBE, funcionalidad está contenida en la clase org.hibernate.criterion.Example. Es conveniente en algunas ocasiones en el que podemos crear un objeto parcial y enviarlo a los criterios en lugar de enviar los valores como sus parámetros.
Supongamos que queremos para que coincida con los nombres de los proveedores. En lugar de enviar el nombre, lo que podemos hacer es crear un objeto surtidor y pasarlo al criterio, de la siguiente manera:
Criterios c2 = session.createCriteria (Proveedor de clase.); Proveedor Proveedor = new Proveedor (); supplier.setName ("Phoenix"); c2.add (Example.create (proveedor)); Lista <Proveedor> list = c2.list (); QBE es muy conveniente para las búsquedas en el que el criterio se construye a partir de la entrada del usuario. Es mejor para las búsquedas avanzadas en múltiples campos están en juego.

JDBC

Procedimiento y Resultados:
Modelo entidad relación: “tienda”


1.    Acceso a BD desde una aplicación de consola
Aplicacion1.java
package proyecto.dao;
import java.sql.* ;
public class Aplicacion1 {
        
         public static void main(String[] args) {
                   try {
                            Class.forName("com.mysql.jdbc.Driver");
                            Connection con = DriverManager.getConnection("jdbc:mysql://localhost/tienda", "root", "");
                            Statement stmt = con.createStatement();
                            String idUsuario = "esaavedra";
                            ResultSet rs = stmt.executeQuery("select id_usuario,clave,nombres,paterno,materno,correo,direccion,telefono,estado from usuario where id_usuario=' " + idUsuario +  " ' ");
                            if(rs.next()) {
                                      System.out.println("Nombres: " + rs.getString(3));
                                      System.out.println("Paterno: " + rs.getString("paterno"));
                                      System.out.println("Correo: " + rs.getString("correo"));
                            }
                            rs.close();
                            stmt.close();
                            con.close();
                   } catch (ClassNotFoundException e) {
                            e.printStackTrace();
                   } catch (SQLException e) {
                            e.printStackTrace();
                   }
         }

}


2.    Acceso a BD desde una aplicación de consola usando DAO
Usuario.java
package proyecto.modelo;
public class Usuario {
         private String idUsuario;
         private String clave;
         private String nombres;
         private String paterno;
         private String materno;
         private String correo;
         private String direccion;
         private String telefono;
         private String estado;
     /* CREAR LOS MÉTODOS GET Y SET PARA CADA ATRIBUTO */
        
}
UsuarioDAO.java
package proyecto.dao;
import java.sql.*;
public class UsuarioDAO {
         public Usuario obtenerPorIdUsuario(String idUsuario){
                   Usuario vo = new Usuario();
                   try {
                            Class.forName("com.mysql.jdbc.Driver");
                            Connection con = DriverManager.getConnection("jdbc:mysql://localhost/tienda", "root", "");
            Statement stmt = con.createStatement();
            ResultSet rs = stmt.executeQuery("select id_usuario,clave,nombres,paterno,materno,correo,direccion,telefono,estado from usuario where id_usuario='"+
                    idUsuario + "'");
            if(rs.next()) {
                vo.setIdUsuario(rs.getString("id_usuario"));
                vo.setClave(rs.getString("clave"));
                vo.setNombres(rs.getString("nombres"));               
                vo.setPaterno(rs.getString("paterno"));
                vo.setMaterno(rs.getString("materno"));
                vo.setCorreo(rs.getString("correo"));
                vo.setDireccion(rs.getString("direccion"));
                vo.setTelefono(rs.getString("telefono"));
                vo.setEstado(rs.getString("estado"));
            }
            rs.close();
            stmt.close();
            con.close();
           } catch (ClassNotFoundException e) {
                   e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return vo;
      }
}
Aplicacion2.java
package proyecto.dao;
public class Aplicacion2 {
        
         public static void main(String[] args) {
                   UsuarioDAO dao = new UsuarioDAO();
                   Usuario u = dao.obtenerPorIdUsuario("esaavedra");
                   System.out.println(u.getNombres());
                   System.out.println(u.getPaterno());
                   System.out.println(u.getMaterno());
         }
}
Creando una clase conexión y los métodos del DAO:
·         Crear la clase ConexionBD
package proyecto.dao;
import java.sql.*;
public final class ConexionBD {
    
     public static Connection obtenerConexion() throws SQLException {
              Connection con = null;
              try {
                       Class.forName("com.mysql.jdbc.Driver");
              } catch (ClassNotFoundException e) {
                       e.printStackTrace();
              }
              con = DriverManager.getConnection("jdbc:mysql://localhost/tienda", "root", "");
              return con;
     }
}


·         En la clase UsuarioDAO, implementar los siguientes métodos:
public Collection<Usuario> buscarPorNombre(String nombre) {
        String query = "select id_usuario,clave,nombres,paterno,materno,correo,direccion,telefono,estado from usuario where nombres like '%"+nombre +"%'";
        Collection<Usuario> c = new ArrayList<Usuario>();
       
        try {
            Connection con = ConexionBD.obtenerConexion();
            Statement stmt = con.createStatement();
            ResultSet rs = stmt.executeQuery(query);
            while(rs.next()) {
                Usuario vo = new Usuario();
                vo.setIdUsuario(rs.getString("id_usuario"));
                vo.setClave(rs.getString("clave"));
                vo.setNombres(rs.getString("nombres"));              
                vo.setPaterno(rs.getString("paterno"));
                vo.setMaterno(rs.getString("materno"));
                vo.setCorreo(rs.getString("correo"));
                vo.setDireccion(rs.getString("direccion"));
                vo.setTelefono(rs.getString("telefono"));
                vo.setEstado(rs.getString("estado"));
                c.add(vo);
            }
            rs.close();
            stmt.close();
            con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return c;
    }
     
public Usuario insertar(Usuario vo) {
              String query = "INSERT INTO usuario (id_usuario,clave,nombres,paterno,materno,correo,direccion, telefono,estado) "
                                 + "VALUES (?,?,?,?,?,?,?,?,?)";
              System.err.println(query);
              Connection con = null;
              PreparedStatement stmt = null;
              try {
                       con = ConexionBD.obtenerConexion();
                       stmt = con.prepareStatement(query);
                       stmt.setString(1, vo.getIdUsuario());
                       stmt.setString(2, vo.getClave());
                       stmt.setString(3, vo.getNombres());
                       stmt.setString(4, vo.getPaterno());
                       stmt.setString(5, vo.getMaterno());
                       stmt.setString(6, vo.getCorreo());
                       stmt.setString(7, vo.getDireccion());
                       stmt.setString(8, vo.getTelefono());
                       stmt.setString(9, vo.getEstado());
                       int i = stmt.executeUpdate();
                       if (i != 1) {
                                 throw new SQLException("No se pudo insertar");
                       }
                       stmt.close();
                       con.close();
              } catch (SQLException e) {
                       System.err.println(e.getMessage());
              }
              return vo;
     }
    public Usuario actualizar(Usuario vo) {
       
        String query = "UPDATE usuario SET clave=?, nombres=?, paterno=?, materno=?, correo=?, direccion=?, telefono=?, estado=? WHERE id_usuario=?";
        try {
            Connection con = ConexionBD.obtenerConexion();
            PreparedStatement stmt = con.prepareStatement(query);
            stmt.setString(1, vo.getClave());
            stmt.setString(2, vo.getNombres());
            stmt.setString(3, vo.getPaterno());
            stmt.setString(4, vo.getMaterno());
            stmt.setString(5, vo.getCorreo());
            stmt.setString(6, vo.getDireccion());
            stmt.setString(7, vo.getTelefono());
            stmt.setString(8, vo.getEstado());
            stmt.setString(9, vo.getIdUsuario());
           
            int i = stmt.executeUpdate();
            if(i != 1){
                throw new SQLException("No se pudo actualizar");
            }
           
            stmt.close();
            con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return vo;
    }


public void eliminar(String idUsuario) {
        String query = "DELETE FROM usuario WHERE id_usuario=?";
        try {
            Connection con = ConexionBD.obtenerConexion();
            PreparedStatement stmt = con.prepareStatement(query);
            stmt.setString(1, idUsuario);
            int i = stmt.executeUpdate();
            if(i != 1){
                throw new SQLException("No se pudo eliminar");
            }
            stmt.close();
            con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
 
    public Collection<Usuario> listarTodos() {
        Collection<Usuario> c = new ArrayList<Usuario>();
        try {
            Connection con = ConexionBD.obtenerConexion();
            Statement stmt = con.createStatement();
            ResultSet rs = stmt.executeQuery("select id_usuario,clave,nombres,paterno,materno,correo,direccion,telefono,estado from usuario");
            while (rs.next()) {
                Usuario vo = new Usuario();
                vo.setIdUsuario(rs.getString("id_usuario"));
                vo.setClave(rs.getString("clave"));
                vo.setNombres(rs.getString("nombres"));              
                vo.setPaterno(rs.getString("paterno"));
                vo.setMaterno(rs.getString("materno"));
                vo.setCorreo(rs.getString("correo"));
                vo.setDireccion(rs.getString("direccion"));
                vo.setTelefono(rs.getString("telefono"));
                vo.setEstado(rs.getString("estado"));
                c.add(vo);
            }
            rs.close();
            stmt.close();
            con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return c;
    }
     
 
3. Acceso a BD desde una aplicación Web usando capas
Se rehusarán las clases Usuario y UsuarioDAO del ejercicio 2.
Estructura del proyecto
/src
   |- / proyecto.dao
                  |- UsuarioDAO
                  |- ConexionBD
   |- / proyecto.servlet
                  |- UsuarioBuscarServlet
   |- / proyecto.modelo
                  |- Usuario
    Agregar el método en UsuarioBuscarServlet.java
     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              UsuarioDAO dao = new UsuarioDAO();
              Collection c = dao.buscarPorNombre(request.getParameter("nombre"));
              request.setAttribute("USUARIOS", c);
              RequestDispatcher rd = request.getRequestDispatcher("/usuario_buscar.jsp");
              rd.forward(request, response);
     }
usuario_buscar.jsp
<%@page import="java.util.*, proyecto.modelo.Usuario" %>
<html>
<head>
<title>Usuario Buscar</title>
</head>
<body>
<form name="f1" action="UsuarioBuscarServlet" method="post">
Nombre: <input type="text" name="nombre"/>
<input type="submit" name="enviar" value="Buscar"/>
</form>
<table border="1">
<tr>
     <th>Id</th><th>Nombre</th><th>Paterno</th><th>Email</th>
</tr>
<%
Collection<Usuario> c = (ArrayList<Usuario>)request.getAttribute("USUARIOS");
if(c != null) {
     for(Usuario vo : c) {
              out.println("<tr><td>"+vo.getIdUsuario()+"</td>");
              out.println("<td>"+vo.getNombres()+"</td>");
              out.println("<td>"+vo.getPaterno()+"</td>");
              out.println("<td>"+vo.getCorreo()+"</td></tr>");
     }
}
%>
</table>
</body>
</html>