[RESOLVIDO] ajuda select + parametro nulo ou não

Pessoal, Bom Dia!

Tenho um select que pode ou não receber parametro. O select passando o parametro esta ok. O problema esta sendo quando o parametro é nulo, pois tem que rodar o select sem a condição, ou seja traz tudo da tabela ou respeita o parametro caso o mesmo seja informado.

Assim dá certo: passando o parametro

[code]public List findTeste(String nomeArquivo, Long cpf, Long safra){

final Query query = this.entityManager.createQuery(
" select new TelemarketingEntity(a.data, a.qtdeRecebida, a.safra, a.qtdeErro, a.qtdeEnviadaOk) " +
" from TelemarketingEntity a, ArquivoEntity b " +
" where a.telemarketingPK.arqnom = b.arquivoPK.arqnom " +
" and a.telemarketingPK.arqnom = :nomeArquivo");

query.setParameter("nomeArquivo", nomeArquivo);

List<TelemarketingEntity> retorno = new ArrayList<TelemarketingEntity>();
retorno.addAll(query.getResultList());

return retorno;			

}[/code]

Estou pesquisando, já fiz algumas tentativas mais ainda não consegui. Alguem pode ajuda??

Agradeço desde já!

Você já ouviu a expressão “if bom é if morto”?
Ela significa que o sistema não deve conter ifs, salvo se, ele realmente seja relevante.
Como assim?
Um if mal colocado é aquele em que eu posso ter a necessidade de concatenar mais ifs, devido à possibilidade de aumento nas várias opções de valor da(s) variável(eis) analisada(s).
Quando temos somente duas opções (sim e não, true ou false, etc), podemos colocar o if, pois sabemos que isto nunca irá mudar.
Assim sendo, você pode colocar um:

String jpql = " select new TelemarketingEntity(a.data, a.qtdeRecebida, a.safra, a.qtdeErro, a.qtdeEnviadaOk) " +  
    " from TelemarketingEntity a, ArquivoEntity b  
    " where a.telemarketingPK.arqnom = b.arquivoPK.arqnom ";
    if(nomeArquivo != null){
        jpql += " and a.telemarketingPK.arqnom = :nomeArquivo";
    }
final Query query = this.entityManager.createQuery(jpql);
    if(nomeArquivo != null){
        query.setParameter("nomeArquivo", nomeArquivo);
    }

Isto é muito comum e bem funcional.

Olá drsmachado!!

Irei fazer conforme explicou.

Essa tela de pesquisa tem 5 parametros que podem ou não ser informados.

Irei testar.

Obrigada!

Eu fiz esse modelo…

ele verifica se existe, e fica preenchendo… :

Primeiro a tela que recebe os parâmetros do Servlet recebidos do JSP… (aqui vc coloca da onde está pegando os dados) que é um vetor

[code]
// Pega a lista do checkbox da tela (relatorio.jsp) e consulta no
// BD para gerar o resultado da pesquisa

public List<ConsultaGerarRelatorio> Verificador(
		String[] MultiplosDadosAtuais) {

	GeraRelatorioDAO dao = new GeraRelatorioDAO();
	List<Integer> tecnologias = new ArrayList<Integer>();
	List<Integer> operadoras = new ArrayList<Integer>();
	List<Integer> status = new ArrayList<Integer>();
	int cod = 0;

	for (String mult : MultiplosDadosAtuais) {
		System.out.println("Valor do Vetor: " + mult);

		if (mult.contains("A") || mult.contains("B")
				|| mult.contains("C") || mult.contains("D")
				|| mult.contains("E")) {

			if (mult.contains("A")) {
				cod = 22;
			} else if (mult.contains("B")) {
				cod = 26;
			} else if (mult.contains("C")) {
				cod = 24;
			} else if (mult.contains("D")) {
				cod = 25;
			} else { // E
				cod = 23;
			}

			System.out.println("Tecnologia: " + cod);

			// CRIA LISTA DE TECNOLOGIAS
			tecnologias.add(cod);

		} else if (mult.contains("CLARO") || mult.contains("TIM")
				|| mult.contains("OI") || mult.contains("CONECTA")) {

			if (mult.contains("CLARO")) {
				cod = 10;
			} else if (mult.contains("TIM")) {
				cod = 11;
			} else if (mult.contains("OI")) {
				cod = 12;
			} else {
				cod = 13;
			}

			System.out.println("Operadora: " + cod);

			// CRIA LISTA DE OPERADORAS
			operadoras.add(cod);

		} else if (mult.contains("Ativo") || mult.contains("Bloqueado")
				|| mult.contains("Cancelado")) {

			if (mult.contains("Ativo")) {
				cod = 16;
			} else if (mult.contains("Bloqueado")) {
				cod = 15;
			} else {
				cod = 14;
			}

			System.out.println("Status: " + cod);

			// CRIA LISTA DE STATUS
			status.add(cod);

		} else {
			System.out.println("Campos vazios: " + mult);

		}

	}

	return dao.listaTecnologias(tecnologias, operadoras, status);

}[/code]

Parte do SELECT que não irá ficar mudando:

	private static final String SQL_ATUAL = " SELECT (SELECT Dominio.Nome FROM Dominio WHERE Dominio.Codigo = Dispositivo.CodigoTecnologia) AS CodTecnologia, "
			+ "(SELECT Dominio.Nome FROM Dominio WHERE Dominio.Codigo = SIMCard.CodigoOperadora) AS Operadora, "
			+ "(SELECT Dominio.Nome FROM Dominio WHERE Dominio.Codigo = Linha.CodigoStatusLinha) AS StatusLinha, "
			+ "COUNT(*) as Quantidade "
			+ "FROM SIMCard LEFT JOIN SIMCardDispositivo ON SIMCardDispositivo.SIMCard_Numero = SIMCard.Numero "
			+ "LEFT JOIN Dispositivo ON Dispositivo.Numero = SIMCardDispositivo.Dispositivo_Numero "
			+ "INNER JOIN Linha ON Linha.Numero = SIMCard.NumeroLinha "
			+ "LEFT JOIN Processamento ON (Processamento.Codigo = SIMCard.CodigoProcessamento OR Processamento.Codigo = Dispositivo.CodigoProcessamento) "
			+ "WHERE (";

recebo 3 listas preenchidas, ou não…

[code]
StringBuilder sql = new StringBuilder("");

public List<ConsultaGerarRelatorio> listaTecnologias(
		List<Integer> tecnologias, List<Integer> operadoras,
		List<Integer> status) {
	Connection conn = null;
	PreparedStatement ps = null;
	List<ConsultaGerarRelatorio> listaConsultaGeraRelatorio = new ArrayList<ConsultaGerarRelatorio>();

	if (!tecnologias.isEmpty()) {
		sql.append(" Dispositivo.CodigoTecnologia IN (");
		for (Iterator<Integer> it = tecnologias.iterator(); it.hasNext();) {
			it.next();
			sql.append("?");
			if (it.hasNext()) {
				sql.append(",");
			}
		}
		sql.append(")");
	}

	if (!operadoras.isEmpty()) {

		if (!tecnologias.isEmpty()) {
			sql.append(" AND SIMCard.CodigoOperadora IN (");
			for (Iterator<Integer> it = operadoras.iterator(); it.hasNext();) {
				it.next();
				sql.append("?");
				if (it.hasNext()) {
					sql.append(",");
				}
			}
			sql.append(")");

		} else {

			sql.append(" SIMCard.CodigoOperadora IN (");
			for (Iterator<Integer> it = operadoras.iterator(); it.hasNext();) {
				it.next();
				sql.append("?");
				if (it.hasNext()) {
					sql.append(",");
				}
			}
			sql.append(")");
		}
	}

	if (!status.isEmpty()) {

		if (!tecnologias.isEmpty() || !operadoras.isEmpty()) {
			sql.append(" AND Linha.CodigoStatusLinha IN (");
			for (Iterator<Integer> it = status.iterator(); it.hasNext();) {
				it.next();
				sql.append("?");
				if (it.hasNext()) {
					sql.append(",");
				}
			}
			sql.append(")");
		} else {

			sql.append(" Linha.CodigoStatusLinha IN (");
			for (Iterator<Integer> it = status.iterator(); it.hasNext();) {
				it.next();
				sql.append("?");
				if (it.hasNext()) {
					sql.append(",");
				}
			}
			sql.append(")");
		}
	}

	sql.append(" )");

	try {

		conn = ConnectionManager.obterConexao();
		ps = conn.prepareStatement(SQL_ATUAL + sql.toString());
		int indicePs = 1;

		if (!tecnologias.isEmpty()) {
			for (Integer i : tecnologias) {
				ps.setInt(indicePs++, i);
			}
		}
		if (!operadoras.isEmpty()) {
			for (Integer i : operadoras) {
				ps.setInt(indicePs++, i);
			}
		}
		if (!status.isEmpty()) {
			for (Integer i : status) {
				ps.setInt(indicePs++, i);
			}
		}

		System.out.println("Consulta: " + SQL_ATUAL + sql.toString());

		ResultSet rs = ps.executeQuery();

		while (rs.next()) {

			ConsultaGerarRelatorio listaRelatorio = new ConsultaGerarRelatorio(
					rs.getString("CodTecnologia"),
					rs.getString("Operadora"), rs.getString("StatusLinha"),
					rs.getString("Quantidade"));

			listaConsultaGeraRelatorio.add(listaRelatorio);

			System.out.println(rs.getString("CodTecnologia") + " "
					+ rs.getString("Operadora") + " "
					+ rs.getString("StatusLinha") + " "
					+ rs.getString("Quantidade"));

		}

	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		ConnectionManager.fecharConexao(conn, null, ps);
	}

	return listaConsultaGeraRelatorio;

}[/code]

da uma analisada que está certinho

Valeu Pacato!