package gcom.util.filtro; import gcom.util.ErroRepositorioException; import gcom.util.Util; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import org.hibernate.Criteria; import org.hibernate.FetchMode; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.criterion.Criterion; import org.hibernate.criterion.Expression; /** * O GeradorHQLCondicional � a classe que � respons�vel por gerar a parte * condicional de uma query HQL dependendo dos par�metros do filtro informado. */ public class GeradorHQLCondicional { public static Query gerarCondicionalQuery(Filtro filtro, String aliasTabela, String query, Session session) throws HibernateException, ErroRepositorioException { Collection parametros = filtro.getParametros(); Iterator iteratorParametros = parametros.iterator(); CondicionalQuery condicionalQueryRetorno = new CondicionalQuery(); condicionalQueryRetorno.setConsultaSemLimites(filtro.isConsultaSemLimites()); if (!query.contains("where")) { query = query + " " + PersistenciaUtil.processaObjetosParaCarregamentoJoinFetch(aliasTabela, filtro.getColecaoCaminhosParaCarregamentoEntidades()); } StringBuffer queryCondicional = condicionalQueryRetorno.getQuery(); int numeroArgumentosIsoladosConector = 0; // Se o filtro n�o tiver par�metros, retorna uma string vazia if (!parametros.isEmpty()) { // Coloca o where no come�o da string condicional queryCondicional.append(" where "); // Vai representar o nome de cada par�metro que for inserido na query // O inteiro ser� convertido para caracter, para que o nome dos parametros // na query fique no formato :a , :b , :c e etc. // Isso � feito porque as vers�es mais novas do hibernate n�o lidam // muito bem com parametros posicionais nas queries int numeroNomeParametro = 97; while (iteratorParametros.hasNext()) { // Percorre todos os par�metros do filtro FiltroParametro filtroParametro = (FiltroParametro) iteratorParametros.next(); // Chama o m�todo de gera��o de acordo com o tipo do par�metro // Para cada par�metro, os valores correspondentes s�o // adicionados na cole��o // Se o numeroArgumentosIsoladosConector for maior que 0, ent�o // existe algum par�metro // que est� isolando outros por Conector if (numeroArgumentosIsoladosConector > 0) { numeroArgumentosIsoladosConector = numeroArgumentosIsoladosConector - 1; } if (numeroArgumentosIsoladosConector == 0) { numeroArgumentosIsoladosConector = filtroParametro.getNumeroArgumentosIsoladosPeloConector(); } if (filtroParametro instanceof Intervalo) { Intervalo intervalo = ((Intervalo) filtroParametro); geradorCondicional(condicionalQueryRetorno, intervalo, aliasTabela, numeroArgumentosIsoladosConector, numeroNomeParametro); condicionalQueryRetorno.getParametrosValores().add(intervalo.getIntervaloInicial()); condicionalQueryRetorno.getParametrosValores().add(intervalo.getIntervaloFinal()); numeroNomeParametro = numeroNomeParametro + 2; } else if (filtroParametro instanceof ParametroSimplesColecao) { ParametroSimplesColecao parametroSimplesColecao = (ParametroSimplesColecao) filtroParametro; geradorCondicional(condicionalQueryRetorno, parametroSimplesColecao, aliasTabela, numeroArgumentosIsoladosConector, numeroNomeParametro); condicionalQueryRetorno.getParametrosValores().add(parametroSimplesColecao.getValor()); numeroNomeParametro++; } else if (filtroParametro instanceof ParametroSimplesColecaoDiferenteDe) { ParametroSimplesColecaoDiferenteDe parametroSimplesColecaoDiferenteDe = (ParametroSimplesColecaoDiferenteDe) filtroParametro; geradorCondicional(condicionalQueryRetorno, parametroSimplesColecaoDiferenteDe, aliasTabela, numeroArgumentosIsoladosConector, numeroNomeParametro); condicionalQueryRetorno.getParametrosValores().add(parametroSimplesColecaoDiferenteDe.getValor()); numeroNomeParametro++; } else if (filtroParametro instanceof ParametroSimples) { ParametroSimples parametroSimples = ((ParametroSimples) filtroParametro); geradorCondicional(condicionalQueryRetorno, parametroSimples, aliasTabela, numeroArgumentosIsoladosConector, numeroNomeParametro); condicionalQueryRetorno.getParametrosValores().add(parametroSimples.getValor()); numeroNomeParametro++; } else if (filtroParametro instanceof ComparacaoTexto) { ComparacaoTexto comparacaoTexto = ((ComparacaoTexto) filtroParametro); geradorCondicional(condicionalQueryRetorno, comparacaoTexto, aliasTabela, numeroArgumentosIsoladosConector, numeroNomeParametro); condicionalQueryRetorno.getParametrosValores().add(comparacaoTexto.getValor()); numeroNomeParametro++; } else if (filtroParametro instanceof ComparacaoTextoCompleto) { ComparacaoTextoCompleto comparacaoTextoCompleto = ((ComparacaoTextoCompleto) filtroParametro); geradorCondicional(condicionalQueryRetorno, comparacaoTextoCompleto, aliasTabela, numeroArgumentosIsoladosConector, numeroNomeParametro); condicionalQueryRetorno.getParametrosValores().add(comparacaoTextoCompleto.getValor()); numeroNomeParametro++; } else if (filtroParametro instanceof ParametroNaoNulo) { ParametroNaoNulo parametroNaoNulo = (ParametroNaoNulo) filtroParametro; geradorCondicional(condicionalQueryRetorno, parametroNaoNulo, aliasTabela, numeroArgumentosIsoladosConector); } else if (filtroParametro instanceof ParametroNulo) { ParametroNulo parametroNulo = (ParametroNulo) filtroParametro; geradorCondicional(condicionalQueryRetorno, parametroNulo, aliasTabela, numeroArgumentosIsoladosConector); } else if (filtroParametro instanceof MenorQue) { MenorQue menorQue = (MenorQue) filtroParametro; geradorCondicional(condicionalQueryRetorno, menorQue, aliasTabela, numeroArgumentosIsoladosConector, numeroNomeParametro); condicionalQueryRetorno.getParametrosValores().add(menorQue.getNumero()); numeroNomeParametro++; } else if (filtroParametro instanceof Menor) { Menor menor = (Menor) filtroParametro; geradorCondicional(condicionalQueryRetorno, menor, aliasTabela, numeroArgumentosIsoladosConector, numeroNomeParametro); condicionalQueryRetorno.getParametrosValores().add(menor.getNumero()); numeroNomeParametro++; } else if (filtroParametro instanceof MenorQueComparacaoColuna) { MenorQueComparacaoColuna menorQueComparacaoColuna = (MenorQueComparacaoColuna) filtroParametro; geradorCondicional(condicionalQueryRetorno, menorQueComparacaoColuna, aliasTabela, numeroArgumentosIsoladosConector, numeroNomeParametro); // condicionalQueryRetorno.getParametrosValores().add( // menorQueComparacaoColuna // .getNomeAtributoIntervaloComparacao()); // numeroNomeParametro++; } else if (filtroParametro instanceof MaiorQue) { MaiorQue maiorQue = (MaiorQue) filtroParametro; geradorCondicional(condicionalQueryRetorno, maiorQue, aliasTabela, numeroArgumentosIsoladosConector, numeroNomeParametro); condicionalQueryRetorno.getParametrosValores().add(maiorQue.getNumero()); numeroNomeParametro++; } else if (filtroParametro instanceof ComparacaoCampos) { ComparacaoCampos comparacaoCampos = (ComparacaoCampos) filtroParametro; geradorCondicional(condicionalQueryRetorno, comparacaoCampos, aliasTabela, numeroArgumentosIsoladosConector); } else if (filtroParametro instanceof ParametroSimplesDiferenteDe) { ParametroSimplesDiferenteDe parametroSimplesDiferenteDe = ((ParametroSimplesDiferenteDe) filtroParametro); geradorCondicional(condicionalQueryRetorno, parametroSimplesDiferenteDe, aliasTabela, numeroArgumentosIsoladosConector, numeroNomeParametro); condicionalQueryRetorno.getParametrosValores().add(parametroSimplesDiferenteDe.getValor()); numeroNomeParametro++; } else if (filtroParametro instanceof ParametroSimplesIn) { ParametroSimplesIn parametroSimplesIn = ((ParametroSimplesIn) filtroParametro); if (!Util.isVazioOrNulo(parametroSimplesIn.getValor())) { geradorCondicional(condicionalQueryRetorno, parametroSimplesIn, aliasTabela, numeroArgumentosIsoladosConector, numeroNomeParametro); condicionalQueryRetorno.getParametrosValores().add(parametroSimplesIn.getValor()); numeroNomeParametro++; } } else if (filtroParametro instanceof ParametroSimplesNotIn) { ParametroSimplesNotIn parametroSimplesNotIn = ((ParametroSimplesNotIn) filtroParametro); if (!Util.isVazioOrNulo(parametroSimplesNotIn.getValor())) { geradorCondicional(condicionalQueryRetorno, parametroSimplesNotIn, aliasTabela, numeroArgumentosIsoladosConector, numeroNomeParametro); condicionalQueryRetorno.getParametrosValores().add(parametroSimplesNotIn.getValor()); numeroNomeParametro++; } } else if (filtroParametro instanceof Maior) { Maior maior = (Maior) filtroParametro; geradorCondicional(condicionalQueryRetorno, maior, aliasTabela, numeroArgumentosIsoladosConector, numeroNomeParametro); condicionalQueryRetorno.getParametrosValores().add(maior.getNumero()); numeroNomeParametro++; } } } // tirar o �ltimo "and" da string condicional e montar a query completa if (queryCondicional.length() > 0) { condicionalQueryRetorno.setQuery(new StringBuffer(query + queryCondicional.substring(0, queryCondicional.length() - 4))); } else { condicionalQueryRetorno.setQuery(new StringBuffer(query + queryCondicional)); } // Verifica se o campo distinct da query foi informado no filtro if (filtro.getCampoDistinct() != null && !filtro.getCampoDistinct().trim().equalsIgnoreCase("")) { // Verifica se o usu�rio j� tem um select na query para desabilitar // o distinct if (!query.startsWith("select")) { condicionalQueryRetorno.setQuery(new StringBuffer("select distinct " + filtro.getCampoDistinct() + " " + condicionalQueryRetorno.getQuery())); } } // Se informado, seta o orderBy da query List<String> camposOrderBy = filtro.getCamposOrderBy(); if (camposOrderBy != null && !camposOrderBy.isEmpty()) { Iterator<String> iteratorOrderBy = camposOrderBy.iterator(); StringBuilder order = new StringBuilder(""); while (iteratorOrderBy.hasNext()) { order.append(aliasTabela); order.append("."); order.append(iteratorOrderBy.next()); order.append(", "); } order.replace((order.length() - 2), order.length(), " "); condicionalQueryRetorno.setQuery(new StringBuffer(condicionalQueryRetorno.getQuery() + " order by " + order)); } // System.out.println(condicionalQueryRetorno.getQuery().toString()); return efetuarQuery(condicionalQueryRetorno, session); } /** * M�todo auxiliar para inserir par�metros dinamicamente na query */ private static Query efetuarQuery(CondicionalQuery condicionalQuery, Session session) throws HibernateException { Query query = session.createQuery(condicionalQuery.getQuery().toString()); Iterator iterator = condicionalQuery.getParametrosValores().iterator(); int i = 97; // Percorre a cole��o de par�metros e faz a associa��o com a query while (iterator.hasNext()) { Object parametro = iterator.next(); // Verifica se algum par�metro possui caracteres com acento para // serem convertidos if (parametro instanceof String) { String parametroString = (String) parametro; // Verifica se existe algum caracter especial na String if (parametroString != null && !parametroString.trim().equals("") && !parametroString.matches("[\\w&&[^��������������������������]]*")) { // Faz o replace para tirar os caracteres especiais da String parametro = parametroString.trim() .replace('�', 'A') .replace('�', 'O') .replace('�', 'A') .replace('�', 'E') .replace('�', 'I') .replace('�', 'U') .replace('�', 'A') .replace('�', 'A') .replace('�', 'E') .replace('�', 'O') .replace('�', 'U') .replace('�', 'C') .replace('�', 'A') .replace('�', 'O') .replace('�', 'A') .replace('�', 'E') .replace('�', 'I') .replace('�', 'U') .replace('�', 'A') .replace('�', 'A') .replace('�', 'E') .replace('�', 'O') .replace('�', 'U') .replace('�', 'C'); } } if (parametro instanceof String) { String parametroString = (String) parametro; if (!parametroString.startsWith("0")) { query.setParameter("a" + i, parametro); i++; } else { query.setString("a" + i, parametroString); i++; } } else if (parametro instanceof Collection) { Collection<? extends Object> parametroCollection = (Collection<? extends Object>) parametro; try { query.setParameterList("a" + i, parametroCollection); } catch (HibernateException e) { query.setParameter("a" + i, parametro); } finally { i++; } } else { query.setParameter("a" + i, parametro); i++; } } return query; } /** * Gera a cl�usula condicional de um intervalo na query */ private static void geradorCondicional( CondicionalQuery condicionalQueryRetorno, Intervalo intervalo, String aliasTabela, int numeroArgumentosIsoladosConector, int numeroNomeParametro) { condicionalQueryRetorno.getQuery().append( processarIsolamentoConector(aliasTabela + "." + intervalo.getNomeAtributo() + " between " + ":" + "a" + numeroNomeParametro + " and " + ":" + "a" + (numeroNomeParametro + 1) + intervalo.getConector(), intervalo, numeroArgumentosIsoladosConector)); } /** * Gera a cl�usula condicional para um par�metro na query */ private static void geradorCondicional( CondicionalQuery condicionalQueryRetorno, ParametroSimples parametro, String aliasTabela, int numeroArgumentosIsoladosConector, int numeroNomeParametro) { condicionalQueryRetorno.getQuery().append( processarIsolamentoConector(aliasTabela + "." + parametro.getNomeAtributo() + " = " + ":" + "a" + numeroNomeParametro + parametro.getConector(), parametro, numeroArgumentosIsoladosConector)); } /** * Gera a cl�usula condicional para um par�metro na query */ private static void geradorCondicional( CondicionalQuery condicionalQueryRetorno, ParametroSimplesDiferenteDe parametro, String aliasTabela, int numeroArgumentosIsoladosConector, int numeroNomeParametro) { condicionalQueryRetorno.getQuery().append( processarIsolamentoConector(aliasTabela + "." + parametro.getNomeAtributo() + " <> " + ":" + "a" + numeroNomeParametro + parametro.getConector(), parametro, numeroArgumentosIsoladosConector)); } private static void geradorCondicional( CondicionalQuery condicionalQueryRetorno, ParametroSimplesIn parametro, String aliasTabela, int numeroArgumentosIsoladosConector, int numeroNomeParametro) { condicionalQueryRetorno.getQuery().append( processarIsolamentoConector(aliasTabela + "." + parametro.getNomeAtributo() + " in ( " + ":" + "a" + numeroNomeParametro + " ) " + parametro.getConector(), parametro, numeroArgumentosIsoladosConector)); } private static void geradorCondicional( CondicionalQuery condicionalQueryRetorno, ParametroSimplesNotIn parametro, String aliasTabela, int numeroArgumentosIsoladosConector, int numeroNomeParametro) { condicionalQueryRetorno.getQuery().append( processarIsolamentoConector(aliasTabela + "." + parametro.getNomeAtributo() + " not in ( " + ":" + "a" + numeroNomeParametro + " ) " + parametro.getConector(), parametro, numeroArgumentosIsoladosConector)); } /** * Gera a cl�usula condicional para um par�metro na query */ private static void geradorCondicional( CondicionalQuery condicionalQueryRetorno, ComparacaoCampos comparacaoCampos, String aliasTabela, int numeroArgumentosIsoladosConector) { condicionalQueryRetorno.getQuery().append( processarIsolamentoConector(aliasTabela + "." + comparacaoCampos.getNomeAtributo() + " = " + aliasTabela + "." + comparacaoCampos.getValor() + comparacaoCampos.getConector(), comparacaoCampos, numeroArgumentosIsoladosConector)); } private static void geradorCondicional( CondicionalQuery condicionalQueryRetorno, MenorQue menorQue, String aliasTabela, int numeroArgumentosIsoladosConector, int numeroNomeParametro) { condicionalQueryRetorno.getQuery().append( processarIsolamentoConector(aliasTabela + "." + menorQue.getNomeAtributo() + " <= " + ":" + "a" + numeroNomeParametro + menorQue.getConector(), menorQue, numeroArgumentosIsoladosConector)); } private static void geradorCondicional( CondicionalQuery condicionalQueryRetorno, Menor menor, String aliasTabela, int numeroArgumentosIsoladosConector, int numeroNomeParametro) { condicionalQueryRetorno.getQuery().append( processarIsolamentoConector(aliasTabela + "." + menor.getNomeAtributo() + " < " + ":" + "a" + numeroNomeParametro + menor.getConector(), menor, numeroArgumentosIsoladosConector)); } private static void geradorCondicional( CondicionalQuery condicionalQueryRetorno, Maior maior, String aliasTabela, int numeroArgumentosIsoladosConector, int numeroNomeParametro) { condicionalQueryRetorno.getQuery().append( processarIsolamentoConector(aliasTabela + "." + maior.getNomeAtributo() + " > " + ":" + "a" + numeroNomeParametro + maior.getConector(), maior, numeroArgumentosIsoladosConector)); } private static void geradorCondicional( CondicionalQuery condicionalQueryRetorno, MenorQueComparacaoColuna menorQueComparacaoColuna, String aliasTabela, int numeroArgumentosIsoladosConector, int numeroNomeParametro) { condicionalQueryRetorno.getQuery().append( processarIsolamentoConector(aliasTabela + "." + menorQueComparacaoColuna.getNomeAtributo() + " < " + aliasTabela + "." + menorQueComparacaoColuna .getNomeAtributoIntervaloComparacao() + menorQueComparacaoColuna.getConector(), menorQueComparacaoColuna, numeroArgumentosIsoladosConector)); } private static void geradorCondicional( CondicionalQuery condicionalQueryRetorno, MaiorQue maiorQue, String aliasTabela, int numeroArgumentosIsoladosConector, int numeroNomeParametro) { condicionalQueryRetorno.getQuery().append( processarIsolamentoConector(aliasTabela + "." + maiorQue.getNomeAtributo() + " >= " + ":" + "a" + numeroNomeParametro + maiorQue.getConector(), maiorQue, numeroArgumentosIsoladosConector)); } /** * Gera a cl�usula condicional para uma compara��o de texto na query */ private static void geradorCondicional( CondicionalQuery condicionalQueryRetorno, ComparacaoTexto comparacaoTexto, String aliasTabela, int numeroArgumentosIsoladosConector, int numeroNomeParametro) { condicionalQueryRetorno.getQuery().append( processarIsolamentoConector("upper(" + aliasTabela + "." + comparacaoTexto.getNomeAtributo() + ")" + " like " + "upper(:" + "a" + numeroNomeParametro + ")" + comparacaoTexto.getConector(), comparacaoTexto, numeroArgumentosIsoladosConector)); } /** * Gera a cl�usula condicional para uma compara��o de texto na query */ private static void geradorCondicional( CondicionalQuery condicionalQueryRetorno, ComparacaoTextoCompleto comparacaoTextoCompleto, String aliasTabela, int numeroArgumentosIsoladosConector, int numeroNomeParametro) { condicionalQueryRetorno.getQuery().append( processarIsolamentoConector("upper(" + aliasTabela + "." + comparacaoTextoCompleto.getNomeAtributo() + ")" + " like " + "upper(:" + "a" + numeroNomeParametro + ")" + comparacaoTextoCompleto.getConector(), comparacaoTextoCompleto, numeroArgumentosIsoladosConector)); } private static void geradorCondicional( CondicionalQuery condicionalQueryRetorno, ParametroNulo parametroNulo, String aliasTabela, int numeroArgumentosIsoladosConector) { condicionalQueryRetorno.getQuery().append( processarIsolamentoConector(aliasTabela + "." + parametroNulo.getNomeAtributo() + " is null" + parametroNulo.getConector(), parametroNulo, numeroArgumentosIsoladosConector)); } private static void geradorCondicional( CondicionalQuery condicionalQueryRetorno, ParametroNaoNulo parametroNaoNulo, String aliasTabela, int numeroArgumentosIsoladosConector) { condicionalQueryRetorno.getQuery().append( processarIsolamentoConector(aliasTabela + "." + parametroNaoNulo.getNomeAtributo() + " is not null" + parametroNaoNulo.getConector(), parametroNaoNulo, numeroArgumentosIsoladosConector)); } private static void geradorCondicional( CondicionalQuery condicionalQueryRetorno, ParametroSimplesColecao parametroSimplesColecao, String aliasTabela, int numeroArgumentosIsoladosConector, int numeroNomeParametro) { condicionalQueryRetorno.getQuery().append(processarIsolamentoConector( parametroSimplesColecao.getNomeAtributo() + " = " + ":" + "a" + numeroNomeParametro + parametroSimplesColecao.getConector(), parametroSimplesColecao, numeroArgumentosIsoladosConector)); } private static void geradorCondicional( CondicionalQuery condicionalQueryRetorno, ParametroSimplesColecaoDiferenteDe parametroSimplesColecaoDiferenteDe, String aliasTabela, int numeroArgumentosIsoladosConector, int numeroNomeParametro) { condicionalQueryRetorno.getQuery().append(processarIsolamentoConector( parametroSimplesColecaoDiferenteDe.getNomeAtributo() + " != " + ":" + "a" + numeroNomeParametro + parametroSimplesColecaoDiferenteDe.getConector(), parametroSimplesColecaoDiferenteDe, numeroArgumentosIsoladosConector)); } public static String processarIsolamentoConector(String condicional, FiltroParametro filtro, int numeroArgumentosIsoladosConector) { String retorno = ""; if (numeroArgumentosIsoladosConector > 0) { // Se o n�mero de par�metros for indicado como �ltimo do isolamento if (numeroArgumentosIsoladosConector > 0 && numeroArgumentosIsoladosConector == 1) { condicional = condicional.substring(0, condicional.length() - 5); retorno = condicional + ")" + filtro.getConector(); // Se o n�mero de par�metros for indicado como o primeiro do isolamento } else if (numeroArgumentosIsoladosConector == filtro.getNumeroArgumentosIsoladosPeloConector()) { retorno = "(" + condicional; } else { retorno = condicional; } } else { retorno = condicional; } return retorno; } /** * Este m�todo gera uma query usando o padr�o Criteria Queries do hibernate */ public static Collection gerarQueryCriteriaExpression(Session session, Filtro filtro, Class classe) throws HibernateException { Collection parametros = filtro.getParametros(); Iterator iteratorParametros = parametros.iterator(); Collection retorno = new ArrayList(); // Se o filtro n�o tiver par�metros, retorna uma cole��o vazia if (!parametros.isEmpty()) { Criteria criteria = session.createCriteria(classe); // Parte que define quais cole��es v�o ser carregadas Collection colecaoCampos = filtro.getColecaoCaminhosParaCarregamentoEntidades(); if (!colecaoCampos.isEmpty()) { Iterator iterator = colecaoCampos.iterator(); while (iterator.hasNext()) { String campoColecao = (String) iterator.next(); criteria.setFetchMode(campoColecao, FetchMode.DEFAULT); } } Criteria criteriaSubFiltro = null; while (iteratorParametros.hasNext()) { FiltroParametro filtroParametro = (FiltroParametro) iteratorParametros.next(); // Cria condicionais na query para subFiltros if (filtroParametro instanceof SubFiltro) { SubFiltro subFiltro = (SubFiltro) filtroParametro; Iterator iteratorSubFiltro = subFiltro.getFiltro().getParametros().iterator(); if (criteriaSubFiltro == null) { criteriaSubFiltro = criteria.createCriteria(subFiltro.getNomeAtributo()); } else { criteriaSubFiltro = criteriaSubFiltro.createCriteria(subFiltro.getNomeAtributo()); } // Percorre todos os par�metros do subFiltro while (iteratorSubFiltro.hasNext()) { FiltroParametro filtroParametroSubFiltro = (FiltroParametro) iteratorSubFiltro.next(); criteriaSubFiltro = criteriaSubFiltro.add(avaliarParametrosQueryCriteriaExpression(session, filtroParametroSubFiltro)); } } else { criteria.add(avaliarParametrosQueryCriteriaExpression(session, filtroParametro)); } } // Seta o n�mero m�ximo de resultados que podem ser retornados // O valor est� em 101 porque o sistema n�o pretende mostrar // mais do que 100 registros simultaneamente criteria.setMaxResults(101); criteria.setCacheable(true); retorno = criteria.list(); } else { // Se nenhum par�metro for informado, a busca traz todos os registros Criteria criteria = session.createCriteria(classe); // Seta o n�mero m�ximo de resultados que podem ser retornados // O valor est� em 101 porque o sistema n�o pretende mostrar // mais do que 100 registros simultaneamente criteria.setMaxResults(101); criteria.setCacheable(true); retorno = criteria.list(); } return retorno; } /** * Este m�todo avalia cada par�metro informado num filtro para ser adicionado * como uma condicional de busca usando o padr�o Criteria Queries do hibernate */ public static Criterion avaliarParametrosQueryCriteriaExpression(Session session, FiltroParametro filtroParametro) throws HibernateException { Criterion retorno = null; // Chama o m�todo de gera��o de acordo com o tipo do par�metro if (filtroParametro instanceof Intervalo) { Intervalo intervalo = ((Intervalo) filtroParametro); // Monta a condicional para a query retorno = Expression.between(intervalo.getNomeAtributo(), intervalo.getIntervaloInicial(), intervalo.getIntervaloFinal()); } else if (filtroParametro instanceof ParametroSimples) { ParametroSimples parametroSimples = ((ParametroSimples) filtroParametro); // Monta a condicional para a query retorno = Expression.eq(parametroSimples.getNomeAtributo(), parametroSimples.getValor()); } else if (filtroParametro instanceof ComparacaoTexto) { ComparacaoTexto comparacaoTexto = ((ComparacaoTexto) filtroParametro); // Monta a condicional para a query retorno = Expression.like(comparacaoTexto.getNomeAtributo(), comparacaoTexto.getValor()).ignoreCase(); } else if (filtroParametro instanceof ParametroNaoNulo) { ParametroNaoNulo parametroNaoNulo = (ParametroNaoNulo) filtroParametro; // Monta a condicional para a query retorno = Expression.isNotNull(parametroNaoNulo.getNomeAtributo()); } else if (filtroParametro instanceof ParametroNulo) { ParametroNulo parametroNulo = (ParametroNulo) filtroParametro; // Monta a condicional para a query retorno = Expression.isNull(parametroNulo.getNomeAtributo()); } else if (filtroParametro instanceof ConectorAnd) { ConectorAnd conectorAnd = (ConectorAnd) filtroParametro; // Obt�m os par�metros FiltroParametro filtro1 = conectorAnd.getFiltro1(); FiltroParametro filtro2 = conectorAnd.getFiltro2(); // Monta a condicional para a query retorno = Expression.and(avaliarParametrosQueryCriteriaExpression(session, filtro1), avaliarParametrosQueryCriteriaExpression(session, filtro2)); } else if (filtroParametro instanceof ConectorOr) { ConectorOr conectorOr = (ConectorOr) filtroParametro; // Obt�m os par�metros FiltroParametro filtro1 = conectorOr.getFiltro1(); FiltroParametro filtro2 = conectorOr.getFiltro2(); // Monta a condicional para a query retorno = Expression.or(avaliarParametrosQueryCriteriaExpression(session, filtro1), avaliarParametrosQueryCriteriaExpression(session, filtro2)); } return retorno; } public static void main(String[] args) { } }