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

4 respostas
I

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

public List<TelemarketingEntity> 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;			
}

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

Agradeço desde já!

4 Respostas

drsmachado

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.

I

Olá drsmachado!!

Irei fazer conforme explicou.

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

Irei testar.

Obrigada!

P

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

// 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);

	}
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...

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;

	}

da uma analisada que está certinho

I

Valeu Pacato!

Criado 22 de abril de 2013
Ultima resposta 23 de abr. de 2013
Respostas 4
Participantes 3