package com.ejie.ab79.dao.preguntasRespuestas;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.sql.DataSource;

import org.springframework.dao.support.DataAccessUtils;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.ejie.ab79.comun.Constantes;
import com.ejie.ab79.model.inspecciones.Inspecciones;
import com.ejie.ab79.model.preguntasRespuestas.OpcionesPrePro;
import com.ejie.ab79.model.preguntasRespuestas.PreguntasProtocolo;
import com.ejie.ab79.model.preguntasRespuestas.PreguntasRespuestasProtocolo;
import com.ejie.ab79.model.preguntasRespuestas.RelProPre;
import com.ejie.ab79.model.preguntasRespuestas.RespuestasProtocolo;
import com.ejie.ab79.model.preguntasRespuestas.TiposPreguntas;
import com.ejie.ab79.model.protocolos.Protocolos;
import com.ejie.x38.dao.RowNumResultSetExtractor;
import com.ejie.x38.dto.JerarquiaDto;
import com.ejie.x38.dto.TableManager;
import com.ejie.x38.dto.TableManagerJerarquia;
import com.ejie.x38.dto.TableRequestDto;
import com.ejie.x38.dto.TableRowDto;

/**
 * PreguntasProtocoloDaoImpl  
 * 
 *  
 */

@Repository
@Transactional
public class PreguntasProtocoloDaoImpl implements PreguntasProtocoloDao {

	public static final String[] ORDER_BY_WHITE_LIST = new String[] { "IDPREGUNTAPROTOCOLO", "IDPROTOCOLO", "ORDEN",
			"DESCRIPCIONCASTELLANO", "DESCRIPCIONEUSKERA", "IDTIPOPREGUNTA", "FECHAREGISTRO", "USUARIOREGISTRO",
			"IDPREGUNTAPADRE", "TIPOPREGUNTADESCEU", "TIPOPREGUNTADESCES", "OPCIONES" };

	private JdbcTemplate jdbcTemplate;

	/*
	 * ROW_MAPPERS
	 */
	private RowMapper<PreguntasProtocolo> rwMap = new RowMapper<PreguntasProtocolo>() {
		public PreguntasProtocolo mapRow(ResultSet resultSet, int rowNum) throws SQLException {

			TiposPreguntas tipoPregunta = new TiposPreguntas();
			tipoPregunta.setIdTipoPregunta(resultSet.getLong("IDTIPOPREGUNTA"));
			tipoPregunta.setDescripcionCastellano(resultSet.getString("TIPOPREGUNTADESCES"));
			tipoPregunta.setDescripcionEuskera(resultSet.getString("TIPOPREGUNTADESCEU"));

			PreguntasProtocolo preguntaProtocolo = new PreguntasProtocolo();
			preguntaProtocolo.setIdPreguntaProtocolo(resultSet.getInt("IDPREGUNTAPROTOCOLO"));
			preguntaProtocolo.setIdTipoPregunta(resultSet.getInt("IDTIPOPREGUNTA"));
			preguntaProtocolo.setTipoPregunta(tipoPregunta);
			preguntaProtocolo.setDescripcionCastellano(resultSet.getString("DESCRIPCIONCASTELLANO"));
			preguntaProtocolo.setDescripcionEuskera(resultSet.getString("DESCRIPCIONEUSKERA"));
			preguntaProtocolo.setFechaRegistro(resultSet.getDate("FECHAREGISTRO"));
			preguntaProtocolo.setUsuarioRegistro(resultSet.getString("USUARIOREGISTRO"));
			preguntaProtocolo.setIdentDatoEstablecimiento(resultSet.getString("IDENTDATOESTABLECIMIENTO"));
			preguntaProtocolo.setPreguntaValidar(resultSet.getInt("PREGUNTAVALIDAR"));
			if (resultSet.wasNull()) {
				preguntaProtocolo.setPreguntaValidar(null);
			}

			return preguntaProtocolo;
		}
	};

	private RowMapper<PreguntasProtocolo> rwMapREST = new RowMapper<PreguntasProtocolo>() {
		public PreguntasProtocolo mapRow(ResultSet resultSet, int rowNum) throws SQLException {

			RelProPre relProPre = new RelProPre();
			relProPre.setIdRelProPre(resultSet.getInt("IDRELPROPRE"));
			relProPre.setIdPreguntaProtocolo(resultSet.getInt("IDPREGUNTAPROTOCOLO"));
			relProPre.setIdPreguntaProtocoloPadre(resultSet.getInt("IDPREGUNTAPROTOCOLOPADRE"));
			relProPre.setIdProtocolo(resultSet.getInt("IDPROTOCOLO"));
			relProPre.setOrden(resultSet.getInt("ORDEN"));

			PreguntasProtocolo preguntaProtocolo = new PreguntasProtocolo();
			preguntaProtocolo.setIdTipoPregunta(resultSet.getInt("IDTIPOPREGUNTA"));
			preguntaProtocolo.setDescripcionCastellano(resultSet.getString("DESCRIPCIONCASTELLANO"));
			preguntaProtocolo.setDescripcionEuskera(resultSet.getString("DESCRIPCIONEUSKERA"));
			preguntaProtocolo.setIdentDatoEstablecimiento(resultSet.getString("IDENTDATOESTABLECIMIENTO"));
			preguntaProtocolo.setPreguntaValidar(resultSet.getInt("PREGUNTAVALIDAR"));
			if (resultSet.wasNull()) {
				preguntaProtocolo.setPreguntaValidar(null);
			}
			preguntaProtocolo.setRelProPre(relProPre);

			return preguntaProtocolo;
		}
	};

	private RowMapper<PreguntasProtocolo> rwMapLineaPregunta = new RowMapper<PreguntasProtocolo>() {
		public PreguntasProtocolo mapRow(ResultSet resultSet, int rowNum) throws SQLException {

			PreguntasProtocolo preguntaProtocolo = new PreguntasProtocolo();
			// preguntaProtocolo.setIdPreguntaPadre(resultSet.getInt("IDPREGUNTAPADREPRO"));
			// preguntaProtocolo.setOrden(resultSet.getInt("ORDEN"));
			preguntaProtocolo.setIdPreguntaProtocolo(resultSet.getInt("IDPREGUNTAPROTOCOLO"));
			preguntaProtocolo.setDescripcionCastellano(resultSet.getString("DESCRIPCIONCASTELLANO"));
			preguntaProtocolo.setDescripcionEuskera(resultSet.getString("DESCRIPCIONEUSKERA"));
			preguntaProtocolo.setIdTipoPregunta(resultSet.getInt("IDTIPOPREGUNTA"));

			return preguntaProtocolo;
		}
	};

	private RowMapper<PreguntasProtocolo> rwMapPK = new RowMapper<PreguntasProtocolo>() {
		public PreguntasProtocolo mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			return new PreguntasProtocolo(resultSet.getInt("IDPREGUNTAPROTOCOLO"));
		}
	};

	/**
	 * Rowmapper para Jerarquía
	 *
	 * @param dataSource
	 *            DataSource
	 * @return
	 */
	private RowMapper<JerarquiaDto<PreguntasProtocolo>> rwMapJerarquia = new RowMapper<JerarquiaDto<PreguntasProtocolo>>() {
		public JerarquiaDto<PreguntasProtocolo> mapRow(ResultSet resultSet, int rowNum) throws SQLException {

			PreguntasProtocolo preguntasprotocolo = new PreguntasProtocolo();

			PreguntasProtocolo preguntaProtocolo = new PreguntasProtocolo();
			preguntaProtocolo.setIdPreguntaProtocolo(resultSet.getInt("IDPREGUNTAPROTOCOLO"));
			preguntaProtocolo.setIdTipoPregunta(resultSet.getInt("IDTIPOPREGUNTA"));
			preguntaProtocolo.setIdPreguntaPadre(resultSet.getInt("IDPREGUNTAPADREPRO"));
			if (resultSet.wasNull()) {
				preguntaProtocolo.setIdPreguntaPadre(null);
			}
			preguntaProtocolo.setOrden(resultSet.getInt("ORDEN"));
			preguntaProtocolo.setDescripcionCastellano(resultSet.getString("DESCRIPCIONCASTELLANO"));
			preguntaProtocolo.setDescripcionEuskera(resultSet.getString("DESCRIPCIONEUSKERA"));
			preguntaProtocolo.setFechaRegistro(resultSet.getDate("FECHAREGISTRO"));
			preguntaProtocolo.setUsuarioRegistro(resultSet.getString("USUARIOREGISTRO"));

			JerarquiaDto<PreguntasProtocolo> jerarquia = new JerarquiaDto<PreguntasProtocolo>();
			jerarquia.setModel(preguntasprotocolo);
			jerarquia.setLevel(resultSet.getBigDecimal("LEVEL").intValue());
			jerarquia.setParentNodes(resultSet.getString("PARENTNODES"));
			jerarquia.setIsLeaf(Boolean.parseBoolean(resultSet.getString("ISLEAF")));
			jerarquia.setFilter(Boolean.parseBoolean(resultSet.getString("FILTER")));
			return jerarquia;
		}
	};

	private RowMapper<OpcionesPrePro> rwMapOpcionesPrePro = new RowMapper<OpcionesPrePro>() {
		public OpcionesPrePro mapRow(ResultSet resultSet, int rowNum) throws SQLException {

			OpcionesPrePro opcionesPrePro = new OpcionesPrePro();
			opcionesPrePro.setIdOpcionPrePro(resultSet.getInt("IDOPCIONPREPRO"));
			opcionesPrePro.setIdPreguntaProtocolo(resultSet.getInt("IDPREGUNTAPROTOCOLO"));
			opcionesPrePro.setDescripcionCastellano(resultSet.getString("DESCRIPCIONCASTELLANO"));
			opcionesPrePro.setDescripcionEuskera(resultSet.getString("DESCRIPCIONEUSKERA"));
			opcionesPrePro.setFechaRegistro(resultSet.getDate("FECHAREGISTRO"));
			opcionesPrePro.setUsuarioRegistro(resultSet.getString("USUARIOREGISTRO"));

			return opcionesPrePro;
		}
	};

	private RowMapper<PreguntasRespuestasProtocolo> rwMapPreguntasRespuestas = new RowMapper<PreguntasRespuestasProtocolo>() {
		public PreguntasRespuestasProtocolo mapRow(ResultSet resultSet, int rowNum) throws SQLException {

			PreguntasProtocolo preguntasProtocolo = new PreguntasProtocolo();
			preguntasProtocolo.setIdPreguntaProtocolo(resultSet.getInt("IDPREGUNTAPROTOCOLO"));
			preguntasProtocolo.setIdTipoPregunta(resultSet.getInt("IDTIPOPREGUNTA"));
			preguntasProtocolo.setIdPreguntaPadre(resultSet.getInt("IDPREGUNTAPADREPRO"));
			if (resultSet.wasNull()) {
				preguntasProtocolo.setIdPreguntaPadre(null);
			}
			preguntasProtocolo.setOrden(resultSet.getInt("ORDEN"));
			preguntasProtocolo.setDescripcionCastellano(resultSet.getString("DESCRIPCIONCASTELLANO"));
			preguntasProtocolo.setDescripcionEuskera(resultSet.getString("DESCRIPCIONEUSKERA"));
			preguntasProtocolo.setFechaRegistro(resultSet.getDate("FECHAREGISTRO"));
			preguntasProtocolo.setUsuarioRegistro(resultSet.getString("USUARIOREGISTRO"));

			RespuestasProtocolo respuestasProtocolo = new RespuestasProtocolo();
			respuestasProtocolo.setIdRespuestaProtocolo(resultSet.getInt("IDRESPUESTAPROTOCOLO"));
			if (resultSet.wasNull()) {
				respuestasProtocolo.setIdRespuestaProtocolo(null);
			}
			respuestasProtocolo.setIdRelProPre(resultSet.getInt("IDPREGUNTAPROTOCOLORESPUESTA"));
			if (resultSet.wasNull()) {
				respuestasProtocolo.setIdRelProPre(null);
			}
			respuestasProtocolo.setRespuesta(resultSet.getString("RESPUESTA"));

			PreguntasRespuestasProtocolo preguntasRespuestasProtocolo = new PreguntasRespuestasProtocolo();
			preguntasRespuestasProtocolo.setPreguntasProtocolo(preguntasProtocolo);
			preguntasRespuestasProtocolo.setRespuestasProtocolo(respuestasProtocolo);
			preguntasRespuestasProtocolo.setIdRelProPre(resultSet.getInt("IDRELPROPRE"));

			return preguntasRespuestasProtocolo;
		}
	};

	private RowMapper<PreguntasProtocolo> rwMapByProtocolo = new RowMapper<PreguntasProtocolo>() {
		public PreguntasProtocolo mapRow(ResultSet resultSet, int rowNum) throws SQLException {

			TiposPreguntas tipoPregunta = new TiposPreguntas();
			tipoPregunta.setIdTipoPregunta(resultSet.getLong("IDTIPOPREGUNTA"));
			tipoPregunta.setDescripcionCastellano(resultSet.getString("TIPOPREGUNTADESCES"));
			tipoPregunta.setDescripcionEuskera(resultSet.getString("TIPOPREGUNTADESCEU"));

			PreguntasProtocolo preguntaProtocolo = new PreguntasProtocolo();
			preguntaProtocolo.setIdPreguntaProtocolo(resultSet.getInt("IDPREGUNTAPROTOCOLO"));
			preguntaProtocolo.setIdProtocolo(resultSet.getInt("IDPROTOCOLO"));
			preguntaProtocolo.setTipoPregunta(tipoPregunta);
			preguntaProtocolo.setIdTipoPregunta(resultSet.getInt("IDTIPOPREGUNTA"));
			preguntaProtocolo.setDescripcionCastellano(resultSet.getString("DESCRIPCIONCASTELLANO"));
			preguntaProtocolo.setDescripcionEuskera(resultSet.getString("DESCRIPCIONEUSKERA"));
			preguntaProtocolo.setOrden(resultSet.getInt("ORDEN"));
			preguntaProtocolo.setIdRelProPre(resultSet.getInt("IDRELPROPRE"));
			preguntaProtocolo.setIdPreguntaPadre(resultSet.getInt("IDPREGUNTAPROTOCOLOPADRE"));
			if (resultSet.wasNull()) {
				preguntaProtocolo.setIdPreguntaPadre(null);
			}

			return preguntaProtocolo;
		}
	};

	/**
	 * Method use to set the datasource.
	 *
	 * @param dataSource
	 *            DataSource
	 * @return
	 */
	@Resource
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}

	/*
	 * OPERACIONES CRUD
	 */

	/**
	 * Inserts a single row in the PreguntasProtocolo table.
	 *
	 * @param preguntasprotocolo
	 *            PreguntasProtocolo
	 * @return PreguntasProtocolo
	 */
	public PreguntasProtocolo add(PreguntasProtocolo preguntasprotocolo) {

		int idPreguntaProtocolo = this.jdbcTemplate.queryForObject("SELECT AB79.S_AB7911T00.NEXTVAL FROM DUAL",
				Integer.class);
		preguntasprotocolo.setIdPreguntaProtocolo(idPreguntaProtocolo);

		String query = "INSERT INTO PREGUNTAS_PROTOCOLO (ID_PREGUNTA_PROTOCOLO, DESCRIPCION_CASTELLANO, DESCRIPCION_EUSKERA, ID_TIPO_PREGUNTA, IDENT_DATO_ESTABLECIMIENTO, PREGUNTA_VALIDAR, FECHA_REGISTRO, USUARIO_REGISTRO) VALUES (?,?,?,?,?,?,?,?)";

		this.jdbcTemplate.update(query, idPreguntaProtocolo, preguntasprotocolo.getDescripcionCastellano(),
				preguntasprotocolo.getDescripcionEuskera(), preguntasprotocolo.getIdTipoPregunta(),
				preguntasprotocolo.getIdentDatoEstablecimiento(), preguntasprotocolo.getPreguntaValidar(),
				preguntasprotocolo.getFechaRegistro(), preguntasprotocolo.getUsuarioRegistro());
		return preguntasprotocolo;
	}

	@Override
	public RelProPre insertRelProPre(RelProPre relProPre) {

		int idRelProPre = this.jdbcTemplate.queryForObject("SELECT AB79.S_AB7919T00.NEXTVAL FROM DUAL",
				Integer.class);
		relProPre.setIdRelProPre(idRelProPre);

		if (relProPre.getOrden() == null) {
			int orden = this.jdbcTemplate.queryForObject("SELECT MAX(t1.ORDEN)+1 ORDEN FROM REL_PRO_PRE t1",
					Integer.class);
			relProPre.setOrden(orden);
		}

		String query = "INSERT INTO REL_PRO_PRE (ID_REL_PRO_PRE, ID_PREGUNTA_PROTOCOLO, ID_PREGUNTA_PROTOCOLO_PADRE, ID_PROTOCOLO, ORDEN, FECHA_REGISTRO, USUARIO_REGISTRO) VALUES (?,?,?,?,?,?,?)";

		this.jdbcTemplate.update(query, relProPre.getIdRelProPre(), relProPre.getIdPreguntaProtocolo(),
				relProPre.getIdPreguntaProtocoloPadre(), relProPre.getIdProtocolo(), relProPre.getOrden(),
				relProPre.getFechaRegistro(), relProPre.getUsuarioRegistro());

		return relProPre;
	}

	/**
	 * Updates a single row in the PreguntasProtocolo table.
	 *
	 * @param preguntasprotocolo
	 *            PreguntasProtocolo
	 * @return PreguntasProtocolo
	 */
	public PreguntasProtocolo update(PreguntasProtocolo preguntasprotocolo) {
		String query = "UPDATE PREGUNTAS_PROTOCOLO SET DESCRIPCION_CASTELLANO=?, DESCRIPCION_EUSKERA=?, ID_TIPO_PREGUNTA=?, IDENT_DATO_ESTABLECIMIENTO=?, PREGUNTA_VALIDAR=?, FECHA_ULTMODIFICACION=?, USUARIO_ULTMODIFICACION=? WHERE ID_PREGUNTA_PROTOCOLO=?";

		this.jdbcTemplate.update(query, preguntasprotocolo.getDescripcionCastellano(),
				preguntasprotocolo.getDescripcionEuskera(), preguntasprotocolo.getIdTipoPregunta(),
				preguntasprotocolo.getIdentDatoEstablecimiento(), preguntasprotocolo.getPreguntaValidar(),
				preguntasprotocolo.getFechaUltmodificacion(), preguntasprotocolo.getUsuarioUltmodificacion(),
				preguntasprotocolo.getIdPreguntaProtocolo());
		return preguntasprotocolo;
	}

	@Override
	public RelProPre updateRelProPre(RelProPre relProPre) {
		String query = "UPDATE REL_PRO_PRE SET ID_PREGUNTA_PROTOCOLO_PADRE=?, ORDEN=?, FECHA_ULTMODIFICACION=?, USUARIO_ULTMODIFICACION=? WHERE ID_REL_PRO_PRE=?";

		this.jdbcTemplate.update(query, relProPre.getIdPreguntaProtocoloPadre(), relProPre.getOrden(),
				relProPre.getFechaUltmodificacion(), relProPre.getUsuarioUltmodificacion(), relProPre.getIdRelProPre());
		return relProPre;
	}

	/**
	 * Finds a single row in the PreguntasProtocolo table.
	 *
	 * @param preguntasprotocolo
	 *            PreguntasProtocolo
	 * @return PreguntasProtocolo
	 */
	@Transactional(readOnly = true)
	public PreguntasProtocolo find(PreguntasProtocolo preguntasprotocolo) {
		String query = "SELECT t1.ID_PREGUNTA_PROTOCOLO IDPREGUNTAPROTOCOLO, t1.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO, t1.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA, t1.ID_TIPO_PREGUNTA IDTIPOPREGUNTA, t1.FECHA_REGISTRO FECHAREGISTRO, t1.USUARIO_REGISTRO USUARIOREGISTRO, t1.IDENT_DATO_ESTABLECIMIENTO IDENTDATOESTABLECIMIENTO, t1.PREGUNTA_VALIDAR PREGUNTAVALIDAR, t2.DESCRIPCION_CASTELLANO TIPOPREGUNTADESCES, t2.DESCRIPCION_EUSKERA TIPOPREGUNTADESCEU FROM PREGUNTAS_PROTOCOLO t1, TIPOS_PREGUNTAS t2  WHERE t1.ID_PREGUNTA_PROTOCOLO = ? AND t1.ID_TIPO_PREGUNTA = t2.ID_TIPO_PREGUNTA ";

		List<PreguntasProtocolo> preguntasprotocoloList = this.jdbcTemplate.query(query, this.rwMap,
				preguntasprotocolo.getIdPreguntaProtocolo());
		return DataAccessUtils.uniqueResult(preguntasprotocoloList);
	}

	@Override
	public List<PreguntasProtocolo> findPreguntasProtocolo(Inspecciones inspeccion) {
		String query = "SELECT t4.ID_PREGUNTA_PROTOCOLO IDPREGUNTAPROTOCOLO, t4.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO, t4.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA, t4.ID_TIPO_PREGUNTA IDTIPOPREGUNTA, t4.FECHA_REGISTRO FECHAREGISTRO, t4.USUARIO_REGISTRO USUARIOREGISTRO, t4.IDENT_DATO_ESTABLECIMIENTO IDENTDATOESTABLECIMIENTO, t4.PREGUNTA_VALIDAR PREGUNTAVALIDAR, t6.ORDEN ORDEN, t6.ID_PREGUNTA_PROTOCOLO_PADRE IDPREGUNTAPADREPRO FROM  INSPECCIONES t1, ORIGENES_INSPECCION t2, PROTOCOLOS t3, PREGUNTAS_PROTOCOLO t4, TIPOS_PREGUNTAS t5, REL_PRO_PRE t6 WHERE t1.ID_INSPECCION = ? and t1.ID_ORIGEN_INSPECCION = t2.ID_ORIGEN_INSPECCION and t1.ID_PROTOCOLO = t3.ID_PROTOCOLO and t1.ID_PROTOCOLO = t6.ID_PROTOCOLO and t4.ID_PREGUNTA_PROTOCOLO = t6.ID_PREGUNTA_PROTOCOLO and t4.ID_TIPO_PREGUNTA = t5.ID_TIPO_PREGUNTA and t4.PREGUNTA_VALIDAR IS NULL ORDER BY ORDEN ASC";

		return this.jdbcTemplate.query(query, this.rwMap, inspeccion.getIdInspeccion());

	}

	@Override
	public List<PreguntasRespuestasProtocolo> findPreguntasRespuestasProtocolo(Inspecciones inspeccion) {
		String query = "SELECT t4.ID_PREGUNTA_PROTOCOLO IDPREGUNTAPROTOCOLO, t4.ID_TIPO_PREGUNTA IDTIPOPREGUNTA, t4.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO, t4.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA, t4.FECHA_REGISTRO FECHAREGISTRO, t4.USUARIO_REGISTRO USUARIOREGISTRO,t6.ID_RESPUESTA_PROTOCOLO IDRESPUESTAPROTOCOLO, t6.ID_REL_PRO_PRE IDPREGUNTAPROTOCOLORESPUESTA, t6.RESPUESTA RESPUESTA, t7.ORDEN ORDEN, t7.ID_REL_PRO_PRE IDRELPROPRE, t7.ID_PREGUNTA_PROTOCOLO_PADRE IDPREGUNTAPADREPRO FROM INSPECCIONES t1, ORIGENES_INSPECCION t2, PROTOCOLOS t3, PREGUNTAS_PROTOCOLO t4, TIPOS_PREGUNTAS t5, RESPUESTAS_PROTOCOLO t6, REL_PRO_PRE t7 WHERE t1.ID_INSPECCION = ? AND t1.ID_INSPECCION = t6.ID_INSPECCION(+) AND t1.ID_ORIGEN_INSPECCION = t2.ID_ORIGEN_INSPECCION AND t1.ID_PROTOCOLO = t3.ID_PROTOCOLO AND t3.ID_PROTOCOLO = t7.ID_PROTOCOLO AND t4.ID_TIPO_PREGUNTA = t5.ID_TIPO_PREGUNTA AND t4.ID_PREGUNTA_PROTOCOLO = t7.ID_PREGUNTA_PROTOCOLO AND t4.PREGUNTA_VALIDAR IS NULL AND t7.ID_REL_PRO_PRE = t6.ID_REL_PRO_PRE(+) ORDER BY ORDEN ASC";

		return this.jdbcTemplate.query(query, this.rwMapPreguntasRespuestas, inspeccion.getIdInspeccion());
	}

	@Override
	public List<OpcionesPrePro> findOpcionesPrePro() {
		String query = "SELECT t1.ID_OPCION_PRE_PRO IDOPCIONPREPRO, t1.ID_PREGUNTA_PROTOCOLO IDPREGUNTAPROTOCOLO, t1.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO, t1.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA, t1.FECHA_REGISTRO FECHAREGISTRO, t1.USUARIO_REGISTRO USUARIOREGISTRO FROM OPCIONES_PRE_PRO t1 WHERE 1=1";

		return this.jdbcTemplate.query(query, this.rwMapOpcionesPrePro);
	}

	@Override
	public Integer calcularNumeroRespuestasPregunta(PreguntasProtocolo preguntaProtocolo) {
		String query = "SELECT COUNT(1) NUMRESPUESTAS FROM RESPUESTAS_PROTOCOLO t1, PREGUNTAS_PROTOCOLO t2, REL_PRO_PRE t3 WHERE t2.ID_PREGUNTA_PROTOCOLO = ? AND t2.ID_PREGUNTA_PROTOCOLO = t3.ID_PREGUNTA_PROTOCOLO AND t3.ID_REL_PRO_PRE = t1.ID_REL_PRO_PRE";
		List<Object> params = new ArrayList<Object>();
		params.add(preguntaProtocolo.getIdPreguntaProtocolo());
		return this.jdbcTemplate.queryForObject(query, params.toArray(), Integer.class);
	}

	@Override
	public Integer calcularNumeroRespuestasRelacion(PreguntasProtocolo preguntaProtocolo) {
		String query = "SELECT COUNT(1) NUMRESPUESTAS FROM RESPUESTAS_PROTOCOLO t1, PREGUNTAS_PROTOCOLO t2, REL_PRO_PRE t3 WHERE t2.ID_PREGUNTA_PROTOCOLO = ? AND t2.ID_PREGUNTA_PROTOCOLO = t3.ID_PREGUNTA_PROTOCOLO AND t3.ID_REL_PRO_PRE = t1.ID_REL_PRO_PRE AND t3.ID_PROTOCOLO = ?";
		List<Object> params = new ArrayList<Object>();
		params.add(preguntaProtocolo.getIdPreguntaProtocolo());
		params.add(preguntaProtocolo.getIdProtocolo());
		return this.jdbcTemplate.queryForObject(query, params.toArray(), Integer.class);
	}

	@Override
	public Integer calcularNumeroRespuestasValidar(PreguntasProtocolo preguntaProtocolo) {
		String query = "SELECT COUNT(1) NUMRESPUESTAS FROM RESPUESTAS_EXPEDIENTE t1, PREGUNTAS_PROTOCOLO t2, PREGUNTAS_EXPEDIENTE t3 WHERE t2.ID_PREGUNTA_PROTOCOLO = ? AND t2.ID_PREGUNTA_PROTOCOLO = t3.ID_PREGUNTA_PROTOCOLO AND t3.ID_PREGUNTA_EXPEDIENTE = t1.ID_PREGUNTA_EXPEDIENTE";
		List<Object> params = new ArrayList<Object>();
		params.add(preguntaProtocolo.getIdPreguntaProtocolo());
		return this.jdbcTemplate.queryForObject(query, params.toArray(), Integer.class);
	}

	@Override
	public List<PreguntasProtocolo> findByProtocolo(PreguntasProtocolo filterPreguntasProtocolo,
			TableRequestDto tableRequestDto, boolean startsWith) {

		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_PREGUNTA_PROTOCOLO IDPREGUNTAPROTOCOLO, t1.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO, t1.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA, t1.ID_TIPO_PREGUNTA IDTIPOPREGUNTA, t2.ID_REL_PRO_PRE IDRELPROPRE, t2.ID_PROTOCOLO IDPROTOCOLO, t2.ID_PREGUNTA_PROTOCOLO_PADRE IDPREGUNTAPROTOCOLOPADRE, t2.ORDEN ORDEN, t3.DESCRIPCION_CASTELLANO TIPOPREGUNTADESCES, t3.DESCRIPCION_EUSKERA TIPOPREGUNTADESCEU ");
		query.append(" FROM PREGUNTAS_PROTOCOLO t1, REL_PRO_PRE t2, TIPOS_PREGUNTAS t3 ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMapRelProPre(filterPreguntasProtocolo, startsWith);
		StringBuilder where = new StringBuilder(
				" WHERE t1.ID_PREGUNTA_PROTOCOLO = t2.ID_PREGUNTA_PROTOCOLO AND t1.ID_TIPO_PREGUNTA = t3.ID_TIPO_PREGUNTA ");
		where.append(mapaWhere.get("query"));
		query.append(where);

		List<?> params = (List<?>) mapaWhere.get("params");

		if (tableRequestDto != null) {
			query = TableManager.getPaginationQuery(tableRequestDto, query);
		} else {
			query.append(" ORDER BY ORDEN");
		}

		return this.jdbcTemplate.query(query.toString(), this.rwMapByProtocolo, params.toArray());
	}

	@Override
	public List<PreguntasProtocolo> getPreguntasRelProPre(PreguntasProtocolo preguntaProtocolo, Integer validar) {

		String query = "SELECT t1.ID_PREGUNTA_PROTOCOLO IDPREGUNTAPROTOCOLO, t1.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO, t1.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA, t1.ID_TIPO_PREGUNTA IDTIPOPREGUNTA, t2.ID_REL_PRO_PRE IDRELPROPRE, t2.ID_PROTOCOLO IDPROTOCOLO, t2.ID_PREGUNTA_PROTOCOLO_PADRE IDPREGUNTAPROTOCOLOPADRE, t2.ORDEN ORDEN, t3.DESCRIPCION_CASTELLANO TIPOPREGUNTADESCES, t3.DESCRIPCION_EUSKERA TIPOPREGUNTADESCEU FROM PREGUNTAS_PROTOCOLO t1, REL_PRO_PRE t2, TIPOS_PREGUNTAS t3 WHERE t1.ID_PREGUNTA_PROTOCOLO = t2.ID_PREGUNTA_PROTOCOLO AND t1.ID_TIPO_PREGUNTA = t3.ID_TIPO_PREGUNTA AND t2.ID_PROTOCOLO = ? ";

		if (validar != null && validar == 0) {
			query += " AND t1.PREGUNTA_VALIDAR IS NULL";
		} else if (validar != null && validar == 1) {
			query += " AND t1.PREGUNTA_VALIDAR = 1";
		}

		query += " ORDER BY ORDEN";

		return this.jdbcTemplate.query(query, this.rwMapByProtocolo, preguntaProtocolo.getIdProtocolo());
	}

	/**
	 * Removes a single row in the PreguntasProtocolo table.
	 *
	 * @param preguntasprotocolo
	 *            PreguntasProtocolo
	 * @return
	 */
	public void remove(PreguntasProtocolo preguntasprotocolo) {
		String query = "DELETE FROM PREGUNTAS_PROTOCOLO WHERE ID_PREGUNTA_PROTOCOLO=?";
		this.jdbcTemplate.update(query, preguntasprotocolo.getIdPreguntaProtocolo());
	}

	@Override
	public void borrarPreguntaRelProPre(RelProPre relProPre) {
		String query = "DELETE FROM REL_PRO_PRE WHERE ID_REL_PRO_PRE=?";
		this.jdbcTemplate.update(query, relProPre.getIdRelProPre());
	}

	@Override
	public void borrarRelProPreByPregunta(RelProPre relProPre) {
		String query = "DELETE FROM REL_PRO_PRE WHERE ID_PREGUNTA_PROTOCOLO=?";
		this.jdbcTemplate.update(query, relProPre.getIdPreguntaProtocolo());
	}

	@Override
	public void borrarRelProPreByProtocolo(Protocolos protocolos) {
		String query = "DELETE FROM REL_PRO_PRE WHERE ID_PROTOCOLO=?";
		this.jdbcTemplate.update(query, protocolos.getIdProtocolo());
	}

	/**
	 * Exporta Datos al clipBoard
	 *
	 */
	public List<PreguntasProtocolo> getMultiple(PreguntasProtocolo filterPreguntasProtocolo,
			TableRequestDto tableRequestDto, Boolean startsWith) {

		// Where clause & Params
		Map<String, Object> mapaWhere = this.getWhereLikeMap(filterPreguntasProtocolo, startsWith);
		StringBuilder where = new StringBuilder(" WHERE 1=1 ");
		where.append(mapaWhere.get("query"));

		@SuppressWarnings("unchecked")
		List<Object> params = (List<Object>) mapaWhere.get("params");

		StringBuilder sbMultipleSQL = TableManager.getSelectMultipleQuery(tableRequestDto, PreguntasProtocolo.class,
				params, "ID_PREGUNTA_PROTOCOLO");

		return this.jdbcTemplate.query(sbMultipleSQL.toString(), this.rwMap, params.toArray());
	}

	/**
	 * Buscamos la linea correspondiente al identificador del dato del
	 * establecimiento
	 *
	 * @param preguntasprotocolo
	 *            PreguntasProtocolo
	 *
	 * @return PreguntasProtocolo
	 */
	@Transactional(readOnly = true)
	public PreguntasProtocolo findLineaPregunta(PreguntasProtocolo preguntasprotocolo) {

		String query = "SELECT t1.ID_PREGUNTA_PROTOCOLO IDPREGUNTAPROTOCOLO, t1.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO, t1.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA, t1.ID_TIPO_PREGUNTA IDTIPOPREGUNTA FROM PREGUNTAS_PROTOCOLO t1 WHERE IDENT_DATO_ESTABLECIMIENTO = ?";

		List<PreguntasProtocolo> preguntasprotocoloList = this.jdbcTemplate.query(query, this.rwMapLineaPregunta,
				preguntasprotocolo.getIdentDatoEstablecimiento());
		return DataAccessUtils.uniqueResult(preguntasprotocoloList);

	}

	/**
	 * Buscamos preguntas que existen en un protocolo distinto al que le pasamos
	 */
	@Override
	public boolean findPreguntasEnOtroProtocolo(Integer idProtocolo, Integer idPreguntaProtocolo) {
		boolean existe = false;
		String query = "SELECT COUNT(1) NUMPREGUNTAS FROM REL_PRO_PRE WHERE ID_PROTOCOLO != ? AND ID_PREGUNTA_PROTOCOLO = ?";
		List<Object> params = new ArrayList<Object>();
		params.add(idProtocolo);
		params.add(idPreguntaProtocolo);
		int nPreguntas = this.jdbcTemplate.queryForObject(query, params.toArray(), Integer.class);

		if (nPreguntas > 0) {
			existe = true;
		}

		return existe;
	}

	@Override
	public boolean findValidarEnOtroProtocolo(PreguntasProtocolo preguntaValidar) {
		boolean existe = false;
		String query = "SELECT COUNT(1) NUMPREGUNTAS FROM (SELECT DISTINCT t1.ID_PROTOCOLO IDPROTOCOLO FROM REL_PRO_PRE t1 WHERE t1.ID_PREGUNTA_PROTOCOLO = ?)";
		List<Object> params = new ArrayList<Object>();
		params.add(preguntaValidar.getIdPreguntaProtocolo());
		int nPreguntas = this.jdbcTemplate.queryForObject(query, params.toArray(), Integer.class);

		if (nPreguntas > 0) {
			existe = true;
		}

		return existe;
	}

	@Override
	public boolean findIdentDatoEstablecimientoRepetido(PreguntasProtocolo preguntaValidar) {
		boolean repetido = false;
		String query = "SELECT COUNT(1) FROM PREGUNTAS_PROTOCOLO t1, TIPOS_PREGUNTAS t2 WHERE 1 = 1 AND t1.ID_TIPO_PREGUNTA = t2.ID_TIPO_PREGUNTA AND t1.PREGUNTA_VALIDAR = "
				+ Constantes.VALIDAR + " AND t1.IDENT_DATO_ESTABLECIMIENTO = ?";
		List<Object> params = new ArrayList<Object>();
		params.add(preguntaValidar.getIdPreguntaProtocolo());
		int nRegistros = this.jdbcTemplate.queryForObject(query, params.toArray(), Integer.class);

		if (nRegistros > 0) {
			repetido = true;
		}

		return repetido;
	}

	/**
	 * Finds a list of rows in the PreguntasProtocolo table.
	 *
	 * @param preguntasprotocolo
	 *            PreguntasProtocolo
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @return List<PreguntasProtocolo>
	 */
	@Transactional(readOnly = true)
	public List<PreguntasProtocolo> findAll(PreguntasProtocolo preguntasprotocolo, TableRequestDto tableRequestDto) {
		StringBuilder query = new StringBuilder(
				"SELECT  t1.ID_PREGUNTA_PROTOCOLO IDPREGUNTAPROTOCOLO,t1.ID_PROTOCOLO IDPROTOCOLO,t1.ORDEN ORDEN,t1.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO,t1.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA,t1.ID_TIPO_PREGUNTA IDTIPOPREGUNTA,t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO, t1.IDENT_DATO_ESTABLECIMIENTO IDENTDATOESTABLECIMIENTO, t1.PREGUNTA_VALIDAR PREGUNTAVALIDAR ");
		query.append("FROM PREGUNTAS_PROTOCOLO t1 ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereMap(preguntasprotocolo);
		StringBuilder where = new StringBuilder(" WHERE 1=1");
		where.append(mapaWhere.get("query"));
		query.append(where);

		List<?> params = (List<?>) mapaWhere.get("params");

		// if (tableRequestDto != null) {
		// query = TableManager.getPaginationQuery(tableRequestDto, query,
		// PreguntasProtocoloDaoImpl.ORDER_BY_WHITE_LIST);
		// }
 
		return this.jdbcTemplate.query(query.toString(), this.rwMap, params.toArray());
	}

	@Override
	public List<PreguntasProtocolo> findAllREST(PreguntasProtocolo filterPreguntasProtocolo) {
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_REL_PRO_PRE IDRELPROPRE, t1.ID_PREGUNTA_PROTOCOLO IDPREGUNTAPROTOCOLO,t1.ID_PROTOCOLO IDPROTOCOLO, t1.ID_PREGUNTA_PROTOCOLO_PADRE IDPREGUNTAPROTOCOLOPADRE,t1.ORDEN ORDEN,t2.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO,t2.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA,t2.ID_TIPO_PREGUNTA IDTIPOPREGUNTA, t2.IDENT_DATO_ESTABLECIMIENTO IDENTDATOESTABLECIMIENTO, t2.PREGUNTA_VALIDAR PREGUNTAVALIDAR ");
		query.append("FROM REL_PRO_PRE t1, PREGUNTAS_PROTOCOLO t2 ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereMap(filterPreguntasProtocolo);
		StringBuilder where = new StringBuilder(" WHERE 1=1 AND t1.ID_PREGUNTA_PROTOCOLO = t2.ID_PREGUNTA_PROTOCOLO ");
		where.append(mapaWhere.get("query"));
		query.append(where);

		List<?> params = (List<?>) mapaWhere.get("params");

		return this.jdbcTemplate.query(query.toString(), this.rwMapREST, params.toArray());
	}

	/**
	 * Finds rows in the PreguntasProtocolo table using like.
	 *
	 * @param preguntasprotocolo
	 *            PreguntasProtocolo
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<PreguntasProtocolo>
	 */
	@Transactional(readOnly = true)
	public List<PreguntasProtocolo> findAllLike(PreguntasProtocolo preguntasprotocolo, TableRequestDto tableRequestDto,
			Boolean startsWith) {
		StringBuilder query = new StringBuilder(
				"SELECT  t1.ID_PREGUNTA_PROTOCOLO IDPREGUNTAPROTOCOLO,t1.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO,t1.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA,t1.ID_TIPO_PREGUNTA IDTIPOPREGUNTA,t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO, t1.IDENT_DATO_ESTABLECIMIENTO IDENTDATOESTABLECIMIENTO, t1.PREGUNTA_VALIDAR PREGUNTAVALIDAR, t2.DESCRIPCION_CASTELLANO TIPOPREGUNTADESCES, t2.DESCRIPCION_EUSKERA TIPOPREGUNTADESCEU ");
		query.append("FROM PREGUNTAS_PROTOCOLO t1, TIPOS_PREGUNTAS t2 ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(preguntasprotocolo, startsWith);
		StringBuilder where = new StringBuilder(" WHERE 1=1 AND t1.ID_TIPO_PREGUNTA = t2.ID_TIPO_PREGUNTA ");
		where.append(mapaWhere.get("query"));
		query.append(where);

		List<?> params = (List<?>) mapaWhere.get("params");

		if (tableRequestDto != null) {
			query = TableManager.getPaginationQuery(tableRequestDto, query);
		}

		return this.jdbcTemplate.query(query.toString(), this.rwMap, params.toArray());
	}

	/*
	 * OPERACIONES RUP_TABLE
	 */

	/**
	 * Counts rows in the PreguntasProtocolo table.
	 *
	 * @param preguntasprotocolo
	 *            PreguntasProtocolo
	 * @return Long
	 */
	@Transactional(readOnly = true)
	public Long findAllCount(PreguntasProtocolo preguntasprotocolo) {
		StringBuilder query = new StringBuilder(
				"SELECT COUNT(1) FROM PREGUNTAS_PROTOCOLO t1 , PREGUNTAS_PROTOCOLO t2 ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereMap(preguntasprotocolo);
		StringBuilder where = new StringBuilder(" WHERE 1=1 AND t1.ID_PREGUNTA_PADRE= t2.ID_PREGUNTA_PROTOCOLO(+) ");
		where.append(mapaWhere.get("query"));
		query.append(where);

		List<?> params = (List<?>) mapaWhere.get("params");

		return this.jdbcTemplate.queryForObject(query.toString(), params.toArray(), Long.class);
	}

	@Override
	public Long findAllLikeCountRelProPre(PreguntasProtocolo preguntasProtocolo, boolean startsWith) {
		StringBuilder query = new StringBuilder(
				"SELECT COUNT(1) FROM PREGUNTAS_PROTOCOLO t1, REL_PRO_PRE t2, TIPOS_PREGUNTAS t3 ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMapRelProPre(preguntasProtocolo, startsWith);
		StringBuilder where = new StringBuilder(
				" WHERE t1.ID_PREGUNTA_PROTOCOLO = t2.ID_PREGUNTA_PROTOCOLO AND t1.ID_TIPO_PREGUNTA = t3.ID_TIPO_PREGUNTA ");
		where.append(mapaWhere.get("query"));
		query.append(where);

		List<?> params = (List<?>) mapaWhere.get("params");

		return this.jdbcTemplate.queryForObject(query.toString(), params.toArray(), Long.class);
	}

	/**
	 * Counts rows in the PreguntasProtocolo table using like.
	 *
	 * @param preguntasprotocolo
	 *            PreguntasProtocolo
	 * @param startsWith
	 *            Boolean
	 * @return Long
	 */
	@Transactional(readOnly = true)
	public Long findAllLikeCount(PreguntasProtocolo preguntasprotocolo, Boolean startsWith) {
		StringBuilder query = new StringBuilder("SELECT COUNT(1) FROM PREGUNTAS_PROTOCOLO t1, TIPOS_PREGUNTAS t2 ");

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(preguntasprotocolo, startsWith);
		StringBuilder where = new StringBuilder(" WHERE t1.ID_TIPO_PREGUNTA = t2.ID_TIPO_PREGUNTA ");
		where.append(mapaWhere.get("query"));
		query.append(where);

		List<?> params = (List<?>) mapaWhere.get("params");

		return this.jdbcTemplate.queryForObject(query.toString(), params.toArray(), Long.class);
	}

	/**
	 * Reorder the data list of PreguntasProtocolo selected for rup_table
	 *
	 * @param preguntasprotocolo
	 *            PreguntasProtocolo
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<TableRowDto<PreguntasProtocolo>>
	 */
	@Override
	public List<TableRowDto<PreguntasProtocolo>> reorderSelectionRelProPre(PreguntasProtocolo preguntasprotocolo,
			TableRequestDto tableRequestDto, Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_PREGUNTA_PROTOCOLO IDPREGUNTAPROTOCOLO,t1.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO,t1.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA,t1.ID_TIPO_PREGUNTA IDTIPOPREGUNTA,t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO ");
		// FROM
		query.append("FROM PREGUNTAS_PROTOCOLO t1, REL_PRO_PRE t2, TIPOS_PREGUNTAS t3 ");
		// FILTRADO
		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMapRelProPre(preguntasprotocolo, startsWith);
		StringBuilder where = new StringBuilder(
				" WHERE t1.ID_PREGUNTA_PROTOCOLO = t2.ID_PREGUNTA_PROTOCOLO AND t1.ID_TIPO_PREGUNTA = t3.ID_TIPO_PREGUNTA ");
		where.append(mapaWhere.get("query"));
		query.append(where);

		// Parámetros de filtrado
		@SuppressWarnings("unchecked")
		List<Object> filterParamList = (List<Object>) mapaWhere.get("params");

		// SQL para la reordenación
		StringBuilder sbReorderSelectionSQL = TableManager.getReorderQuery(query, tableRequestDto,
				PreguntasProtocolo.class, filterParamList, "ID_PREGUNTA_PROTOCOLO");

		return this.jdbcTemplate.query(sbReorderSelectionSQL.toString(),
				new RowNumResultSetExtractor<PreguntasProtocolo>(this.rwMapPK, tableRequestDto),
				filterParamList.toArray());
	}

	@Override
	public List<TableRowDto<PreguntasProtocolo>> reorderSelection(PreguntasProtocolo filterPreguntasProtocolo,
			TableRequestDto tableRequestDto, Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_PREGUNTA_PROTOCOLO IDPREGUNTAPROTOCOLO,t1.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO,t1.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA,t1.ID_TIPO_PREGUNTA IDTIPOPREGUNTA,t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO ");
		// FROM
		query.append("FROM PREGUNTAS_PROTOCOLO t1, TIPOS_PREGUNTAS t2 ");
		// FILTRADO
		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(filterPreguntasProtocolo, startsWith);
		StringBuilder where = new StringBuilder(" WHERE t1.ID_TIPO_PREGUNTA = t2.ID_TIPO_PREGUNTA ");
		where.append(mapaWhere.get("query"));
		query.append(where);

		// Parámetros de filtrado
		@SuppressWarnings("unchecked")
		List<Object> filterParamList = (List<Object>) mapaWhere.get("params");

		// SQL para la reordenación
		StringBuilder sbReorderSelectionSQL = TableManager.getReorderQuery(query, tableRequestDto,
				PreguntasProtocolo.class, filterParamList, "ID_PREGUNTA_PROTOCOLO");

		return this.jdbcTemplate.query(sbReorderSelectionSQL.toString(),
				new RowNumResultSetExtractor<PreguntasProtocolo>(this.rwMapPK, tableRequestDto),
				filterParamList.toArray());
	}

	/**
	 * Search method for rup_table
	 *
	 * @param filterParams
	 *            PreguntasProtocolo
	 * @param searchParams
	 *            PreguntasProtocolo
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<TableRowDto<PreguntasProtocolo>>
	 */
	@Override
	public List<TableRowDto<PreguntasProtocolo>> search(PreguntasProtocolo filterParams,
			PreguntasProtocolo searchParams, TableRequestDto tableRequestDto, Boolean startsWith) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_PREGUNTA_PROTOCOLO IDPREGUNTAPROTOCOLO,t1.ID_PROTOCOLO IDPROTOCOLO,t1.ORDEN ORDEN,t1.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO,t1.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA,t1.ID_TIPO_PREGUNTA IDTIPOPREGUNTA,t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO,t2.ID_PREGUNTA_PROTOCOLO PREGUNTASPROTOCOLOIDPREGUNTAPROTOCOLO,t2.ID_PROTOCOLO PREGUNTASPROTOCOLOIDPROTOCOLO,t2.ORDEN PREGUNTASPROTOCOLOORDEN,t2.DESCRIPCION_CASTELLANO PREGUNTASPROTOCOLODESCRIPCIONCASTELLANO,t2.DESCRIPCION_EUSKERA PREGUNTASPROTOCOLODESCRIPCIONEUSKERA,t2.ID_TIPO_PREGUNTA PREGUNTASPROTOCOLOIDTIPOPREGUNTA,t2.FECHA_REGISTRO PREGUNTASPROTOCOLOFECHAREGISTRO,t2.USUARIO_REGISTRO PREGUNTASPROTOCOLOUSUARIOREGISTRO,t2.ID_PREGUNTA_PADRE PREGUNTASPROTOCOLOIDPREGUNTAPADRE ");
		// FROM
		query.append("FROM PREGUNTAS_PROTOCOLO t1 ,PREGUNTAS_PROTOCOLO t2 ");
		// TABLAS_ALIAS
		List<String> from_alias = new ArrayList<String>();
		from_alias.add(" t1 ");
		from_alias.add(" t2 ");

		// FILTRADO
		Map<String, ?> mapaWhereFilter = this.getWhereLikeMap(filterParams, startsWith);
		StringBuilder where = new StringBuilder(" WHERE 1=1 AND t1.ID_PREGUNTA_PADRE= t2.ID_PREGUNTA_PROTOCOLO(+) ");
		where.append(mapaWhereFilter.get("query"));
		query.append(where);
		// Filter params
		@SuppressWarnings("unchecked")
		List<Object> filterParamList = (List<Object>) mapaWhereFilter.get("params");

		// BUSQUEDA
		Map<String, Object> mapaWhereSearch = this.getWhereLikeMap(searchParams, startsWith);
		String searchSQL = ((StringBuilder) mapaWhereSearch.get("query")).toString();
		// Search params
		@SuppressWarnings("unchecked")
		List<Object> searchParamList = (List<Object>) mapaWhereSearch.get("params");

		// SQL
		StringBuilder sbReorderSelectionSQL = TableManager.getSearchQuery(query, tableRequestDto,
				PreguntasProtocolo.class, filterParamList, searchSQL, searchParamList, from_alias,
				"ID_PREGUNTA_PROTOCOLO");

		return this.jdbcTemplate.query(sbReorderSelectionSQL.toString(),
				new RowNumResultSetExtractor<PreguntasProtocolo>(this.rwMapPK, tableRequestDto),
				filterParamList.toArray());
	}

	/**
	 * Remove multiple method for rup_table
	 *
	 * @param filterpreguntasprotocolo
	 *            PreguntasProtocolo
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @param startsWith
	 *            Boolean
	 */
	@Override
	public void removeMultiple(PreguntasProtocolo filterpreguntasprotocolo, TableRequestDto tableRequestDto,
			Boolean startsWith) {
		// SELECT
		/** TODO: select por clave */
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_PREGUNTA_PROTOCOLO IDPREGUNTAPROTOCOLO,t1.ID_PROTOCOLO IDPROTOCOLO,t1.ORDEN ORDEN,t1.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO,t1.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA,t1.ID_TIPO_PREGUNTA IDTIPOPREGUNTA,t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO,t2.ID_PREGUNTA_PROTOCOLO PREGUNTASPROTOCOLOIDPREGUNTAPROTOCOLO,t2.ID_PROTOCOLO PREGUNTASPROTOCOLOIDPROTOCOLO,t2.ORDEN PREGUNTASPROTOCOLOORDEN,t2.DESCRIPCION_CASTELLANO PREGUNTASPROTOCOLODESCRIPCIONCASTELLANO,t2.DESCRIPCION_EUSKERA PREGUNTASPROTOCOLODESCRIPCIONEUSKERA,t2.ID_TIPO_PREGUNTA PREGUNTASPROTOCOLOIDTIPOPREGUNTA,t2.FECHA_REGISTRO PREGUNTASPROTOCOLOFECHAREGISTRO,t2.USUARIO_REGISTRO PREGUNTASPROTOCOLOUSUARIOREGISTRO,t2.ID_PREGUNTA_PADRE PREGUNTASPROTOCOLOIDPREGUNTAPADRE ");
		// FROM
		query.append("FROM PREGUNTAS_PROTOCOLO t1 ,PREGUNTAS_PROTOCOLO t2 ");

		// WHERE
		Map<String, Object> mapaWhere = this.getWhereLikeMap(filterpreguntasprotocolo, startsWith);
		StringBuilder where = new StringBuilder(" WHERE 1=1 ");
		where.append(mapaWhere.get("query"));
		query.append(where);

		@SuppressWarnings("unchecked")
		List<Object> params = (List<Object>) mapaWhere.get("params");

		StringBuilder sbRemoveMultipleSQL = TableManager.getRemoveMultipleQuery(tableRequestDto,
				PreguntasProtocolo.class, query, params, "ID_PREGUNTA_PROTOCOLO");
		this.jdbcTemplate.update(sbRemoveMultipleSQL.toString(), params.toArray());
	}

	/**
	 * Filter in the hierarchical PreguntasProtocolo table.
	 *
	 * @param filterPreguntasProtocolo
	 *            PreguntasProtocolo
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @return List<JerarquiaDto<PreguntasProtocolo>>
	 */
	@Override
	public List<JerarquiaDto<PreguntasProtocolo>> findAllLikeJerarquia(PreguntasProtocolo filterPreguntasProtocolo,
			TableRequestDto tableRequestDto) {
		// SELECT
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_PREGUNTA_PROTOCOLO IDPREGUNTAPROTOCOLO,t1.ID_PROTOCOLO IDPROTOCOLO,t1.ORDEN ORDEN,t1.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO,t1.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA,t1.ID_TIPO_PREGUNTA IDTIPOPREGUNTA,t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO,t2.ID_PREGUNTA_PROTOCOLO PREGUNTASPROTOCOLOIDPREGUNTAPROTOCOLO,t2.ID_PROTOCOLO PREGUNTASPROTOCOLOIDPROTOCOLO,t2.ORDEN PREGUNTASPROTOCOLOORDEN,t2.DESCRIPCION_CASTELLANO PREGUNTASPROTOCOLODESCRIPCIONCASTELLANO,t2.DESCRIPCION_EUSKERA PREGUNTASPROTOCOLODESCRIPCIONEUSKERA,t2.ID_TIPO_PREGUNTA PREGUNTASPROTOCOLOIDTIPOPREGUNTA,t2.FECHA_REGISTRO PREGUNTASPROTOCOLOFECHAREGISTRO,t2.USUARIO_REGISTRO PREGUNTASPROTOCOLOUSUARIOREGISTRO,t2.ID_PREGUNTA_PADRE PREGUNTASPROTOCOLOIDPREGUNTAPADRE ");
		// FROM
		// StringBuilder from = new StringBuilder("FROM PREGUNTAS_PROTOCOLO t1
		// ,PREGUNTAS_PROTOCOLO t2 ");
		List<String> from = new ArrayList<String>();
		from.add("PREGUNTAS_PROTOCOLO");
		from.add("PREGUNTAS_PROTOCOLO");
		// TABLAS_ALIAS
		List<String> from_alias = new ArrayList<String>();
		from_alias.add(" t1 ");
		from_alias.add(" t2 ");

		// JOINS TABLAS
		/*
		 * Ejemplo de como indicar joins entre las tablas de la query
		 */
		/*
		 * StringBuilder joins = new StringBuilder("");
		 * joins.append("AND T1.ID=T2.ID_T1");
		 */

		// CONDICIONES (negocio)
		/*
		 * Ejemplo de como incluir condiciones de negocio en la consulta de la
		 * jerarquía
		 */
		/*
		 * StringBuilder businessFilters = new StringBuilder(); List<Object>
		 * businessParams = new ArrayList<Object>();
		 * businessFilters.append("   AND t1.EJIE = ?  ");
		 * businessParams.add("1");
		 */

		// FILTRO
		Map<String, ?> mapaWhere = this.getWhereLikeMap(filterPreguntasProtocolo, false);

		// JERARQUIA
		// Especificar la columna padre correspondiente en lugar de la generada
		// por defecto (ID_PADRE)
		query = TableManagerJerarquia.getQuery(tableRequestDto, query, mapaWhere, "ID_PREGUNTA_PROTOCOLO", "ID_PADRE",
				"NOMBRE", from, from_alias);

		/*
		 * Ejemplo de llamada en caso de indicar joins entre tablas y
		 * condiciones de negocio
		 */
		// query = TableManagerJerarquia.getQuery(tableRequestDto, query,
		// mapaWhere, "ID", "ID_PADRE", "NOMBRE", from, from_alias, joins,
		// businessFilters, businessParams);

		// PAGINACION
		// if (tableRequestDto != null) {
		// query = TableManagerJerarquia.getPaginationQuery(tableRequestDto,
		// query, PreguntasProtocoloDaoImpl.ORDER_BY_WHITE_LIST);
		// }

		List<?> params = (List<?>) mapaWhere.get("params");
		return this.jdbcTemplate.query(query.toString(), this.rwMapJerarquia, params.toArray());
	}

	/**
	 * Count rows in hierarchy
	 *
	 * @param filterPreguntasProtocolo
	 *            PreguntasProtocolo
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @return Long
	 */
	@Override
	public Long findAllLikeCountJerarquia(PreguntasProtocolo filterPreguntasProtocolo,
			TableRequestDto tableRequestDto) {
		// FROM
		// StringBuilder from = new StringBuilder("FROM PREGUNTAS_PROTOCOLO t1
		// ,PREGUNTAS_PROTOCOLO t2 ");
		List<String> from = new ArrayList<String>();
		from.add("PREGUNTAS_PROTOCOLO");
		from.add("PREGUNTAS_PROTOCOLO");

		// TABLAS_ALIAS
		List<String> from_alias = new ArrayList<String>();
		from_alias.add(" t1 ");
		from_alias.add(" t2 ");

		// JOINS TABLAS
		/*
		 * Ejemplo de como indicar joins entre las tablas de la query
		 */
		/*
		 * StringBuilder joins = new StringBuilder("");
		 * joins.append("AND T1.ID=T2.ID_T1");
		 */

		// CONDICIONES (negocio)
		/*
		 * Ejemplo de como incluir condiciones de negocio en la consulta de la
		 * jerarquía
		 */
		/*
		 * StringBuilder businessFilters = new StringBuilder(); List<Object>
		 * businessParams = new ArrayList<Object>();
		 * businessFilters.append("   AND t1.EJIE = ?  ");
		 * businessParams.add("1");
		 */

		// FILTRO
		Map<String, ?> mapaWhere = this.getWhereLikeMap(filterPreguntasProtocolo, false);

		// JERARQUIA
		// Especificar la columna padre correspondiente en lugar de la generada
		// por defecto (ID_PADRE)
		StringBuilder query = TableManagerJerarquia.getQueryCount(tableRequestDto, mapaWhere, "ID_PREGUNTA_PROTOCOLO",
				"ID_PADRE", from, from_alias);

		/*
		 * Ejemplo de llamada en caso de indicar joins entre tablas y
		 * condiciones de negocio
		 */
		// StringBuilder query =
		// TableManagerJerarquia.getQueryCount(tableRequestDto, mapaWhere, "ID",
		// "ID_PADRE", from, from_alias, joins, businessFilters,
		// businessParams);

		List<?> params = (List<?>) mapaWhere.get("params");
		return this.jdbcTemplate.queryForObject(query.toString(), params.toArray(), Long.class);
	}

	/**
	 * Find dependent hierarchical rows
	 *
	 * @param filterPreguntasProtocolo
	 *            PreguntasProtocolo
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @return List<TableRowDto<PreguntasProtocolo>>
	 */
	@Override
	public List<TableRowDto<PreguntasProtocolo>> findAllChild(PreguntasProtocolo filterPreguntasProtocolo,
			TableRequestDto tableRequestDto) {

		// FROM
		// StringBuilder from = new StringBuilder("FROM PREGUNTAS_PROTOCOLO t1
		// ,PREGUNTAS_PROTOCOLO t2 ");
		List<String> from = new ArrayList<String>();
		from.add("PREGUNTAS_PROTOCOLO");
		from.add("PREGUNTAS_PROTOCOLO");

		// TABLAS_ALIAS
		List<String> from_alias = new ArrayList<String>();
		from_alias.add(" t1 ");
		from_alias.add(" t2 ");

		// JOINS TABLAS
		/*
		 * Ejemplo de como indicar joins entre las tablas de la query
		 */
		/*
		 * StringBuilder joins = new StringBuilder("");
		 * joins.append("AND T1.ID=T2.ID_T1");
		 */

		// CONDICIONES (negocio)
		/*
		 * Ejemplo de como incluir condiciones de negocio en la consulta de la
		 * jerarquía
		 */
		/*
		 * StringBuilder businessFilters = new StringBuilder(); List<Object>
		 * businessParams = new ArrayList<Object>();
		 * businessFilters.append("   AND t1.EJIE = ?  ");
		 * businessParams.add("1");
		 */

		// FILTRO
		Map<String, ?> mapaWhere = this.getWhereLikeMap(filterPreguntasProtocolo, false);

		// MULTISELECCION
		// Especificar la columna padre correspondiente en lugar de la generada
		// por defecto (ID_PADRE)
		StringBuilder query = TableManagerJerarquia.getQueryChildren(tableRequestDto, mapaWhere,
				"ID_PREGUNTA_PROTOCOLO", "ID_PADRE", from, from_alias);

		/*
		 * Ejemplo de llamada en caso de indicar joins entre tablas y
		 * condiciones de negocio
		 */
		// StringBuilder query =
		// TableManagerJerarquia.getQueryChildren(tableRequestDto, mapaWhere,
		// "ID", "ID_PADRE", from, from_alias, joins, businessFilters,
		// businessParams);

		List<?> params = (List<?>) mapaWhere.get("params");

		return this.jdbcTemplate.query(query.toString(),
				new RowNumResultSetExtractor<PreguntasProtocolo>(this.rwMapPK, "ID_PREGUNTA_PROTOCOLO"),
				params.toArray());
	}

	/*
	 * MÉTODOS PRIVADOS
	 */

	/**
	 * Returns a map with the needed value to create the conditions to filter by
	 * the PreguntasProtocolo entity
	 *
	 * @param preguntasprotocolo
	 *            PreguntasProtocolo Bean with the criteria values to filter by.
	 * @return Map created with two keys key query stores the sql query syntax
	 *         key params stores the parameter values to be used in the
	 *         condition sentence.
	 */
	// CHECKSTYLE:OFF CyclomaticComplexity - Generación de código de UDA
	private Map<String, ?> getWhereMap(PreguntasProtocolo preguntasprotocolo) {

		StringBuilder where = new StringBuilder(PreguntasProtocoloDaoImpl.STRING_BUILDER_INIT);
		List<Object> params = new ArrayList<Object>();

		if (preguntasprotocolo != null && preguntasprotocolo.getIdPreguntaProtocolo() != null) {
			where.append(" AND t1.ID_PREGUNTA_PROTOCOLO = ?");
			params.add(preguntasprotocolo.getIdPreguntaProtocolo());
		}

		if (preguntasprotocolo != null && preguntasprotocolo.getOrden() != null) {
			where.append(" AND t1.ORDEN = ?");
			params.add(preguntasprotocolo.getOrden());
		}
		if (preguntasprotocolo != null && preguntasprotocolo.getDescripcionCastellano() != null) {
			where.append(" AND t1.DESCRIPCION_CASTELLANO = ?");
			params.add(preguntasprotocolo.getDescripcionCastellano());
		}
		if (preguntasprotocolo != null && preguntasprotocolo.getDescripcionEuskera() != null) {
			where.append(" AND t1.DESCRIPCION_EUSKERA = ?");
			params.add(preguntasprotocolo.getDescripcionEuskera());
		}
		if (preguntasprotocolo != null && preguntasprotocolo.getIdTipoPregunta() != null) {
			where.append(" AND t1.ID_TIPO_PREGUNTA = ?");
			params.add(preguntasprotocolo.getIdTipoPregunta());
		}
		if (preguntasprotocolo != null && preguntasprotocolo.getFechaRegistro() != null) {
			where.append(" AND t1.FECHA_REGISTRO = ?");
			params.add(preguntasprotocolo.getFechaRegistro());
		}
		if (preguntasprotocolo != null && preguntasprotocolo.getUsuarioRegistro() != null) {
			where.append(" AND t1.USUARIO_REGISTRO = ?");
			params.add(preguntasprotocolo.getUsuarioRegistro());
		}

		Map<String, Object> mapWhere = new HashMap<String, Object>();
		mapWhere.put("query", where);
		mapWhere.put("params", params);

		return mapWhere;
	}
	// CHECKSTYLE:ON CyclomaticComplexity - Generación de código de UDA

	/**
	 * Returns a map with the needed value to create the conditions to filter by
	 * the PreguntasProtocolo entity
	 *
	 * @param preguntasprotocolo
	 *            PreguntasProtocolo Bean with the criteria values to filter by.
	 * @param startsWith
	 *            Boolean
	 * @return Map created with two keys key query stores the sql query syntax
	 *         key params stores the parameter values to be used in the
	 *         condition sentence.
	 */
	// CHECKSTYLE:OFF CyclomaticComplexity - Generación de código de UDA
	private Map<String, Object> getWhereLikeMap(PreguntasProtocolo preguntasprotocolo, Boolean startsWith) {

		StringBuilder where = new StringBuilder(PreguntasProtocoloDaoImpl.STRING_BUILDER_INIT);
		List<Object> params = new ArrayList<Object>();

		if (preguntasprotocolo != null && preguntasprotocolo.getIdPreguntaProtocolo() != null) {
			where.append(" AND t1.ID_PREGUNTA_PROTOCOLO = ?");
			params.add(preguntasprotocolo.getIdPreguntaProtocolo());
		}
		if (preguntasprotocolo != null && preguntasprotocolo.getDescripcionCastellano() != null) {
			where.append(" AND UPPER(t1.DESCRIPCION_CASTELLANO) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(preguntasprotocolo.getDescripcionCastellano().toUpperCase() + "%");
			} else {
				params.add("%" + preguntasprotocolo.getDescripcionCastellano().toUpperCase() + "%");
			}
			where.append(" AND t1.DESCRIPCION_CASTELLANO IS NOT NULL");
		}
		if (preguntasprotocolo != null && preguntasprotocolo.getDescripcionEuskera() != null) {
			where.append(" AND UPPER(t1.DESCRIPCION_EUSKERA) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(preguntasprotocolo.getDescripcionEuskera().toUpperCase() + "%");
			} else {
				params.add("%" + preguntasprotocolo.getDescripcionEuskera().toUpperCase() + "%");
			}
			where.append(" AND t1.DESCRIPCION_EUSKERA IS NOT NULL");
		}
		if (preguntasprotocolo != null && preguntasprotocolo.getIdTipoPregunta() != null) {
			where.append(" AND t1.ID_TIPO_PREGUNTA = ?");
			params.add(preguntasprotocolo.getIdTipoPregunta());
		}
		if (preguntasprotocolo != null && preguntasprotocolo.getFechaRegistro() != null) {
			where.append(" AND t1.FECHA_REGISTRO = ?");
			params.add(preguntasprotocolo.getFechaRegistro());
		}
		if (preguntasprotocolo != null && preguntasprotocolo.getUsuarioRegistro() != null) {
			where.append(" AND UPPER(t1.USUARIO_REGISTRO) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(preguntasprotocolo.getUsuarioRegistro().toUpperCase() + "%");
			} else {
				params.add("%" + preguntasprotocolo.getUsuarioRegistro().toUpperCase() + "%");
			}
			where.append(" AND t1.USUARIO_REGISTRO IS NOT NULL");
		}
		if (preguntasprotocolo != null && preguntasprotocolo.getIdentDatoEstablecimiento() != null) {
			where.append(" AND UPPER(t1.IDENT_DATO_ESTABLECIMIENTO) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(preguntasprotocolo.getIdentDatoEstablecimiento().toUpperCase() + "%");
			} else {
				params.add("%" + preguntasprotocolo.getIdentDatoEstablecimiento().toUpperCase() + "%");
			}
			where.append(" AND t1.IDENT_DATO_ESTABLECIMIENTO IS NOT NULL");
		}
		if (preguntasprotocolo != null && preguntasprotocolo.getPreguntaValidar() != null) {
			where.append(" AND t1.PREGUNTA_VALIDAR = ?");
			params.add(preguntasprotocolo.getPreguntaValidar());
		} else if (preguntasprotocolo != null && preguntasprotocolo.getPreguntaValidar() == null) {
			where.append(" AND t1.PREGUNTA_VALIDAR IS NULL");
		}

		Map<String, Object> mapWhere = new HashMap<String, Object>();
		mapWhere.put("query", where);
		mapWhere.put("params", params);

		return mapWhere;
	}

	private Map<String, Object> getWhereLikeMapRelProPre(PreguntasProtocolo preguntasprotocolo, Boolean startsWith) {

		StringBuilder where = new StringBuilder(PreguntasProtocoloDaoImpl.STRING_BUILDER_INIT);
		List<Object> params = new ArrayList<Object>();

		if (preguntasprotocolo != null && preguntasprotocolo.getIdPreguntaProtocolo() != null) {
			where.append(" AND t1.ID_PREGUNTA_PROTOCOLO = ?");
			params.add(preguntasprotocolo.getIdPreguntaProtocolo());
		}
		if (preguntasprotocolo != null && preguntasprotocolo.getOrden() != null) {
			where.append(" AND t1.ORDEN = ?");
			params.add(preguntasprotocolo.getOrden());
		}
		if (preguntasprotocolo != null && preguntasprotocolo.getDescripcionCastellano() != null) {
			where.append(" AND UPPER(t1.DESCRIPCION_CASTELLANO) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(preguntasprotocolo.getDescripcionCastellano().toUpperCase() + "%");
			} else {
				params.add("%" + preguntasprotocolo.getDescripcionCastellano().toUpperCase() + "%");
			}
			where.append(" AND t1.DESCRIPCION_CASTELLANO IS NOT NULL");
		}
		if (preguntasprotocolo != null && preguntasprotocolo.getDescripcionEuskera() != null) {
			where.append(" AND UPPER(t1.DESCRIPCION_EUSKERA) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(preguntasprotocolo.getDescripcionEuskera().toUpperCase() + "%");
			} else {
				params.add("%" + preguntasprotocolo.getDescripcionEuskera().toUpperCase() + "%");
			}
			where.append(" AND t1.DESCRIPCION_EUSKERA IS NOT NULL");
		}
		if (preguntasprotocolo != null && preguntasprotocolo.getIdTipoPregunta() != null) {
			where.append(" AND t1.ID_TIPO_PREGUNTA = ?");
			params.add(preguntasprotocolo.getIdTipoPregunta());
		}
		if (preguntasprotocolo != null && preguntasprotocolo.getFechaRegistro() != null) {
			where.append(" AND t1.FECHA_REGISTRO = ?");
			params.add(preguntasprotocolo.getFechaRegistro());
		}
		if (preguntasprotocolo != null && preguntasprotocolo.getUsuarioRegistro() != null) {
			where.append(" AND UPPER(t1.USUARIO_REGISTRO) like ? ESCAPE  '\\'");
			if (startsWith) {
				params.add(preguntasprotocolo.getUsuarioRegistro().toUpperCase() + "%");
			} else {
				params.add("%" + preguntasprotocolo.getUsuarioRegistro().toUpperCase() + "%");
			}
			where.append(" AND t1.USUARIO_REGISTRO IS NOT NULL");
		}
		if (preguntasprotocolo != null && preguntasprotocolo.getPreguntaValidar() != null) {
			where.append(" AND t1.PREGUNTA_VALIDAR = ?");
			params.add(preguntasprotocolo.getPreguntaValidar());
		} else if (preguntasprotocolo != null && preguntasprotocolo.getPreguntaValidar() == null) {
			where.append(" AND t1.PREGUNTA_VALIDAR IS NULL");
		}
		if (preguntasprotocolo != null && preguntasprotocolo.getIdProtocolo() != null) {
			where.append(" AND t2.ID_PROTOCOLO = ?");
			params.add(preguntasprotocolo.getIdProtocolo());
		}

		Map<String, Object> mapWhere = new HashMap<String, Object>();
		mapWhere.put("query", where);
		mapWhere.put("params", params);

		return mapWhere;
	}
	// CHECKSTYLE:ON CyclomaticComplexity - Generación de código de UDA

	/**
	 * StringBuilder initilization value
	 */
	public static final int STRING_BUILDER_INIT = 4096;

}
