Uso de consultas complejas

Introducción

En este ejercicio se modificarán los ficheros *.xml de los DAO para hacer consultas más complejas contra otras tablas de la base de datos.

Modificar el DAO para añadir una consulta compleja

Actualizaremos el DAO de OfferCandidatesDao para agregarle nueva información en el *.xml. En este caso, tratará de añadir una nueva consulta que refleje las otras tablas que se usan desde este DAO para relacionar las ofertas, los candidatos y el estado. Como esta tabla solo contiene identificadores, nuestra nueva consulta permitirá conocer todos los datos y no únicamente sus identificadores.

tutorial_12.png

En el fichero *.xml, agregaremos una nueva etiqueta Queries en el que añadiremos las nuevas consultas mediante la etiqueta Query. En dicha consulta, podremos indicarle la consulta a ejecutar a través de la etiqueta Sentence. Como queremos utilizar las columnas y condiciones que nos indiquen a través de la petición, usaremos los marcadores #COLUMNS# y #WHERE#. La utilización de la etiqueta AmbiguousColumn indicará cuáles son las columnas ambiguas (en este caso, la columna DESCRIPTION de OFFER_CANDIDATE_STATUS y OFFER, usando el nombre de DESC_STATUS para OFFER_CANDIDATE_STATUS). En caso de que queramos modificar la consulta que se realiza por defecto, el identificador de la etiqueta sería defaultQuery id="default". Como queremos mantener la consulta por defecto, pondremos otro identificador.

OfferCandidatesDao.xml

<?xml version="1.0" encoding="UTF-8"?>
<JdbcEntitySetup
        xmlns="http://www.ontimize.com/schema/jdbc"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.ontimize.com/schema/jdbc http://www.ontimize.com/schema/jdbc/ontimize-jdbc-dao.xsd"
        catalog="" schema="${mainschema}" table="OFFER_CANDIDATES"
        datasource="mainDataSource" sqlhandler="dbSQLStatementHandler">
    <DeleteKeys>
        <Column>ID</Column>
    </DeleteKeys>
    <UpdateKeys>
        <Column>ID</Column>
    </UpdateKeys>
    <GeneratedKey>ID</GeneratedKey>

    <Queries>
        <Query id="details">
            <AmbiguousColumns>
                <AmbiguousColumn name="DESC_STATUS" prefix="OS"
                                 databaseName="DESCRIPTION"/>
                <AmbiguousColumn name="OFF_STATUS" prefix="OCS"
                                 databaseName="DESCRIPTION"/>
            </AmbiguousColumns>
            <Sentence>
                <![CDATA[
                     SELECT
                      #COLUMNS#
                     FROM
                      PUBLIC.OFFER_CANDIDATES OC
                     INNER JOIN PUBLIC.OFFER O ON
                      OC.OFFER_ID = O.ID
                     INNER JOIN PUBLIC.CANDIDATE C ON
                      OC.CANDIDATE_ID = C.ID
                     INNER JOIN PUBLIC.OFFER_STATUS OS ON
                      O.OFFER_STATUS = OS.ID
                     INNER JOIN PUBLIC.OFFER_CANDIDATE_STATUS OCS ON
                      O.OFFER_STATUS = OCS.ID
                     #WHERE#
                ]]>
            </Sentence>
        </Query>
    </Queries>
</JdbcEntitySetup>

En el fichero java, añadiremos una nueva constante, que tendrá el mismo valor que el nombre del identificador que hemos establecido para la consulta.

OfferCandidatesDao.java

package com.ontimize.hr.model.core.dao;

import com.ontimize.jee.server.dao.common.ConfigurationFile;
import com.ontimize.jee.server.dao.jdbc.OntimizeJdbcDaoSupport;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Repository;

@Repository("OfferCandidatesDao")
@Lazy
@ConfigurationFile(configurationFile = "dao/OfferCandidatesDao.xml", configurationFilePlaceholder = "dao/placeholders.properties")
public class OfferCandidatesDao extends OntimizeJdbcDaoSupport {

    public static final String ATTR_ID = "ID";
    public static final String ATTR_OFFER_ID = "OFFER_ID";
    public static final String ATTR_CANDIDATE_ID = "CANDIDATE_ID";
    public static final String ATTR_OFFER_CANDIDATE_STATUS = "OFFER_CANDIDATE_STATUS";
    public static final String QUERY_OFFER_DETAILS = "details";

}

Modificar la interfaz y el servicio para añadir el nuevo método

Actualizaremos la interfaz IOfferService para añadir el nuevo método que realizará la consulta. En caso de ser la consulta por defecto, no sería necesario hacer ninguno de los pasos indicados a continuación.

Para simplificar el código que se está escribiendo, pueden aparecer tres puntos (…) en algunas partes del código. Esto indica que puede haber código anterior antes y después de esos puntos.

IOfferService.java

...

public interface IOfferService {

    ...

    // OFFER CANDIDATES
    ...

    EntityResult offerCandidateDetailsQuery(Map<String, Object> keyMap, List<String> attrList) throws OntimizeJEERuntimeException;

    // OFFER CANDIDATES STATUS
    ...
}

En el servicio, implementamos el nuevo método de la interfaz, utilizando el daoHelper para crear la consulta, pero añadiendo un nuevo parámetro a continuación de la lista de columnas a consultar, que será el identificador de la consulta que hemos creado en el DAO (y que hemos asociado a una constante en el fichero java correspondiente).

OfferService.java

...

@Service("OfferService")
@Lazy
public class OfferService implements IOfferService {

    ...

    @Override
    public EntityResult offerCandidateDetailsQuery(Map<String, Object> keyMap, List<String> attrList)
            throws OntimizeJEERuntimeException {
        return this.daoHelper.query(this.offerCandidatesDao, keyMap, attrList, OfferCandidatesDao.QUERY_OFFER_DETAILS);
    }

    ...
}

Podemos probar esta nueva consulta con la ayuda de Postman

arrow_back Tutorial anterior Próximo tutorial arrow_forward