Liferay Custom SQL

Data de publicació 11/03/15 15:06

El Service Builder de Liferay te permite crear tu propio modelo de negocio y, además, te crea los servicios los cuáles usarán el modelo que has especificado en el service.xml.

Liferay también te puede generar finders para devolver datos o colecciones de datos de la persistencia. Aún así, a veces necesitamos más lógica a la hora de hacer una consulta. Especifico estas tablas a modo de ejemplo:

Empleado [ID, NOMBRE, DNI, FECHA_NACIMIENTO, DEPARTAMENTO_ID, etc]
Departamento [ID, CIUDAD, NUM_EMPLEADOS, etc]

 

No entraremos como hacer finders con el service.xml pero sí hace falta remarcar que esos finders se hacen a partir de los datos que tiene una entidad. Por ejemplo: podemos crear un finder en la entidad Empleado que devuelva todos los empleados con fecha de nacimiento y departamento indicados.

Para hacer un ejemplo, encontrar todos los empleados que tengan su departamento en una ciudad especifica ya no es posible hacerlo des de el service.xml, por lo tanto tenemos que hacer una custom sql.

Antes de empezar creando la custom sql se ha de añadir (si no esta añadido ya) un archivo default.xml en la ruta 'docroot/WEB-INF/src/custom-sql/' y, des de éste, añadiremos el archivo que vayamos a crear:

<?xml version="1.0"?>
<custom-sql>
    <sql file="custom-sql/empleado.xml" />
</custom-sql>
 

A partir de aquí, la creación son 3 pasos:

1. Especificar tu custom SQL

En el mismo directorio que se encuentra default.xml creamos un archivo empleado.xml. Tendrá la siguiente forma:

<?xml version="1.0" encoding="UTF-8"?>
<custom-sql>
    <sql id="[fully-qualified class name + method]">
        <![CDATA[
            SQL QUERY
        ]]>
    </sql>
    <sql id="[fully-qualified class name + method2]">
        <![CDATA[
            SQL QUERY 2
        ]]>
    </sql>
</custom-sql>


El "fully-qualified class name" ha de ser de la forma: "com.[proyecto].service.persistance.EntidadFinder".
La sentencia sql irá entre els tags " <![CDATA[ " y " ]]> ":

<?xml version="1.0" encoding="UTF-8"?>
<custom-sql>
    <sql id="com.proyecto.service.persistance.EmpleadoFinder.getEmpleadosPorCiudad">
        <![CDATA[           
            Select empleado.*
               From Empleado empleado
               Left outer join Departamento departamento
                  on empleado.depatamentoId=departamento.id
               where (departamento.ciudad Like ?)
        ]]>
    </sql>
</custom-sql>


Esta custom sql es como un formulario que se rellenará con cada petición. En este caso se substituirá el símbolo '?' por el nombre de una ciudad.

 

2. Método Finder

El Service Builder no crea la clase "EntidadFinderImpl.java", por lo que nos tocará a nosotros este paso. Se crea en el directorio "com/[proyecto]/service/persistance/", en nuestro caso haremos la clase "EmpleadoFinderImpl.java":

package com.proyecto.service.persistence;
 
public class EmpleadoFinderImpl extends BasePersistanceImpl<Empleado>
                                implements EmpleadoFinder {
 
}


Una vez hecho esto, tenemos que hacer la acción de 'build service'. Se creará a partir de la clase "EmpleadoFinderImpl.java", la interfaz "EmpleadoFinder.java" y la clase "EmpleadoFinderUtil.java".

Ahora podemos completar nuestra clase "EmpleadoFinderImpl.java":

package com.proyecto.service.persistence;
 
public class EmpleadoFinderImpl extends BasePersistanceImpl<Empleado> 
          implements EmpleadoFinder {
    public static String GET_EMPLEADOS_POR_CIUDAD =
                     EmpleadoFinder.class.getName() + "getEmpleadosPorCiudad";
     
    public List<Empleado> getEmpleadosPorCiudad(String ciudad, int begin, int end) 
        throws SystemException {
        Session session = null;
        try {
            session = openSession();
 
            /*Recuperas la función custom sql que has creado en el xml*/
            String sql = CustomSQLUtil.get(GET_EMPLEADOS_POR_CIUDAD);
 
            /*Creas un objeto sql a partir de la custom sql*/
            SQLQuery q = session.createSQLQuery(sql);
            q.setCacheable(false);
            /*Añades la entidad empleado que será el objeto de retorno*/
            q.addEntity("EMPLEADO", EmpleadoImpl.class);
 
            QueryPos qPos = QueryPos.getInstance(q);
            /*Añades en orden los parámetros necesarios para ejecutar la sql*/
            qPos.add(ciudad);
 
            return (List<Empleado>) QueryUtil.list(q, getDialect(), begin, end);
        catch (Exception e) {
            try {
                throw new SystemException(e);
            catch (SystemException se) {
                se.printStackTrace();
            }
        finally {
            closeSession(session);
        }
        return null;
    }
}

Volvemos a hacer el 'build service' i ya tenemos creada nuestra función custom.
 

3. Enlazar con el service

Liferay te genera los servicios para tu modelo de negocio, para acceder a tu custom sql es recomendable que tenga la misma forma de acceso que estos servicios.

En este paso tan solo tenemos que abrir el archivo LocalServiceImpl (o ServiceImpl dependiendo si los servicios son locales o remotos) y añadir una función que llame al finder:

public class EmpleadoLocalServiceImpl extends EmpleadoLocalServiceBaseImpl {
     
    public List<Empleado> getEmpleadosPorCiudad(String ciutat, int begin, int end)
             throws SystemException {
        EmpleadoFinderUtil.getEmpleadosPorCiudad(ciutat,begin,end);
    }
}


De nuevo, y por último, volvemos a hacer 'build service' para que se cree el servicio. Ahora des de tu portlet podrás llamar a "EmpleadoLocalServiceUtil.getEmpleadosPorCiudad("Barcelona",0,num);"

Un saludo y, ¡espero que os haya servido de ayuda!

Comentaris
Encara no hi ha cap comentari. Vull ser el primer.

Bloggers recents Bloggers recents

Oscar Rodríguez
Apunts: 9
Estrelles: 2
Data: 28/09/16
David Berruezo
Apunts: 14
Estrelles: 1
Data: 22/07/16
Javi Martín
Apunts: 2
Estrelles: 1
Data: 20/05/16
Javier Torres
Apunts: 5
Estrelles: 3
Data: 11/04/16
Sergi Mingueza
Apunts: 4
Estrelles: 1
Data: 19/10/15
Matilde Gallardo
Apunts: 1
Estrelles: 0
Data: 26/02/15
Adrià Vilà
Apunts: 4
Estrelles: 4
Data: 31/08/14
Elena Ruiz
Apunts: 1
Estrelles: 2
Data: 13/03/14