Manipular 3 listas [RESOLVIDO]

25 respostas
P

Pessoal, queria ajuda em uma dúvida que estou,

Tenho 3 listas, e preciso pegar os dados e ficar fazendo consultas no BD através destes valores, só que preciso ficar combinando os valores, para consultar todas as possibilidades…tipo assim…

Tecnologia 1
Operadora 1
Status 1

depois

Tecnologia 1
Operadora 2
Status 1

depois

Tecnologia 1
Operadora 1
Status 2

depois

Tecnologia 2
Operadora 1
Status 1

assim por diante…

Entendaram? misturando os dados de entrada para realizar as consultas…

Não sei como montar uma lógica sobre isso

25 Respostas

Rodrigo_Sasaki

Tem que consultar todos?
Se for isso pode ser resolvido com um for triplo. Pode parecer feio, mas se tem que passar por todos os cenários, não tem jeito.

P

exato rodrigo, tem que passar por todos e consultar todos... fazendo essas combinações, não to conseguindo adaptar estes 3 "for"

minha classe ta assim... as listas já estão preenchidas...

StringBuilder sql = new StringBuilder("SELECT DISTINCT (Dispositivo.Numero) AS Dispositivo, "
	+ "(Dispositivo.CodigoTecnologia) AS CodTecnologia, "
	+ "(Dispositivo.CodigoAPNConfigurada) AS APNConfigurada, "
	+ "(SIMCard.Numero) AS SIMCard, "
	+ "(Linha.Numero) AS Linha, "
	+ "(SIMCard.CodigoOperadora) AS Operadora, "
	+ "(SIMCard.CodigoAPNProvisionada) AS APNProvisionada, "
	+ "(SIMCard.CodigoStatusSIMCard) AS StatusSIMCard, "
	+ "(Processamento.CodigoFonteDados) AS Fonte, "
	+ "(SIMCard.DataAlteracao) AS DtAlteracao, "
	+ "(Dispositivo.IMEI) AS IMEI, "
	+ "(SIMCard.IMSI) AS IMSI, "
	+ "(Linha.CodigoStatusLinha) AS StatusLinha, "
	+ "(SIMCard.ConsumoDados) AS ConsDados, "
	+ "(Processamento.MatriculaCadastro) AS Matricula "
	+ "FROM SIMCard, Dispositivo, Linha, Processamento, SIMCardDispositivo, Dominio "
	+ "WHERE SIMCard.Numero = SIMCardDispositivo.SIMCard_Numero "
	+ "AND SIMCardDispositivo.Dispositivo_Numero = Dispositivo.Numero "
	+ "AND Linha.Numero = SIMCard.NumeroLinha ");




			
	public List<ConsultaGerarRelatorio> listaTecnologias(List<Integer> tecnologias, List<Integer> operadoras, List<Integer> status){
		Connection conn = null;
		PreparedStatement ps = null;
		
		
// AQUI É UM ESBOÇO DA MINHA TENTATIVA
while(!tecnologias.isEmpty() && !operadoras.isEmpty() && !status.isEmpty()){
			for(int a=0; a <= tecnologias.size(); a++){
				tecnologias.get(a);
				
			}
// ABAIXO UMA CONDIÇÃO DE FICAR ADICIONANDO VALOR NO "IN" POR ISSO USAR LISTA PARA CONSULTAR			
			
		}
		
		if ( !tecnologias.isEmpty() ) {
		    sql.append(" AND Dispositivo.CodigoTecnologia IN (");
		    for(Integer i : tecnologias) {
		    	if (tecnologias.isEmpty()){
		    		sql.append("?");
		    	} else {
		    		sql.append("?,");
		    	}
		    }
		  }

		  if ( !operadoras.isEmpty() ) { 
		  sql.append(" AND SIMCard.CodigoOperadora IN (");
		    for(Integer i : operadoras) {
		    	if (operadoras.isEmpty()){
		    		sql.append("?");
		    	} else {
		    		sql.append("?,");
		    	}
		    }
		  }
		  
		  if ( !status.isEmpty() ) { 
		  sql.append(" AND Linha.CodigoStatusLinha IN (");
		    for(Integer i : status) {
		    	if (status.isEmpty()){
		    		sql.append("?");
		    	} else {
		    		sql.append("?,");
		    	}
		    }
		  }
		
		  try { 
		
			  conn = ConnectionManager.obterConexao();
			  ps = conn.prepareStatement(SQL_);
		
			  int indicePs = 1; // ou zero, nunca lembro o primeiro
			  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);
			    }
			  }
			  
		  } catch (Exception e) {
				e.printStackTrace();
			} finally {
				ConnectionManager.fecharConexao(conn, null, ps);
			}
		  
		  
		  
		return null;
		
	}
Rodrigo_Sasaki

Faça um método ou uma classe que encapsule essa funcionalidade de adicionar clausulas ou fazer a consulta, fazer tudo de uma vez pode estar te confundindo. E enfim você fará algo assim:for(Tecnologia tecnologia : listTecnologias){ for(Operadora operadora : listOperadoras){ for(Status status : listStatus){ metodoQueVoceCriou(tecnologia, operadora, status); } } }

P

to apanhando um pouco… não peguei o entendimento ainda dessas combinações… mas to tentando

E

Dependendo do driver e do banco você tem um limite para o número de parâmetros que você pode passar em um PreparedStatement.
Felizmente, pelo que imagino, no seu problema você não deve passar desse limite, porque não há 1000 operadoras de telefonia celular no Brasil :slight_smile:

P

entanglement , os parâmetros são:

A
Alarmes
DAF
TM PORTO
Nanocomm
DAF VII

B
CLARO
TIM
OI
CONECTA

C
Ativo
Bloqueado
Cancelado

Podendo ser todos como apenas 1 para consultar

sergiotaborda

Este tipo de pensamento de “combinação” advém da falta de OO no seu código.
Vc não está abstraindo o que significa essas três cosias juntas. Olhando o seu SQL , dá para ver que significam “dispositivo”.

então o que vc precisa é montar uma lista de dispositivos com todas as combinações. Depois simplesmente passar a lista de dispositivos para o select.
O select não é com IN é com AND e OR , pois senão vira um select * da vida.

Primeiro vc usa o for triplo para criar os dispositivos. Vc cria uma classe Dispositivo com os três campos sendo usados.
Depois vc passa essa lista para onde vai fazer a query.

Ficaria ± assim

for (Dispositivo dispositivo : dispositivos){
sql.append("(Dispositivo.CodigoTecnologia  =  ? and AND SIMCard.CodigoOperadora = ? and Linha.CodigoStatusLinha = ? )"
sql.append (" OR ")
}

No fim vai ter um OR a mais que vc precisa remover, ou usar iterator em vez de for extendido para ter mais controle de quando colocar o OR

Repare que sempre usou ? em vez de valores no seu prepared statement.

Depois que tiver o prepared statement (ps) precisa fazer um novo for setando os campos

int campo = 1;
for (Dispositivo dispositivo : dispositivos){
ps.setInteger(campo++, dispositivo.getTecnologia());
ps.setInteger(campo++, dispositivo.getOperadora());
ps.setInteger(campo++, dispositivo.getLinha());
}

Se vc usar OO seu problema desparece. O seu problema está em tentar usar IN onde não cabe e tentar fazer tudo num passo só.

P

Ok,

Obrigado pelas informações Sergio… estarei melhorando o código e depois venho aqui postar.

Mas preciso dar uma adptada, pois não será sempre que virá valores em todos os campos, então não posso colocar um sql.append com as 3 condições, pode vir vazio, e no postgre tem que definir IS NULL, então verifico antes se eles estão vazios…

mas vou melhorar isso…

Outra coisa… vcs poderiam me ajudar com a adaptação do triplo for?/

eu já defini as listas e estão sendo populadas…Mas não sei como fazer esse triplo for.

// inicio as listas

List<Integer> tecnologias = null;
List<Integer> operadoras = null;
List<Integer> status = null;
		
:
:		

// Aqui já estão populadas...		
tecnologias = Arrays.asList(cod);
operadoras = Arrays.asList(cod);
status = Arrays.asList(cod);
sergiotaborda

O Rodrigo Sasaki já explicou como seria. No miolo do for mais interno simplesmente crrie um objeto Dispositivo, sete os campos e coloque na lista de dispositivos. só isso.

P

desculpa pela falta de experiência…

mas é que não sei definir os parâmetros para o for… Tecnologia tecnolgia : listTecnologias, por exemplo

sergiotaborda

Pacato:
desculpa pela falta de experiência…

mas é que não sei definir os parâmetros para o for… Tecnologia tecnolgia : listTecnologias, por exemplo

revendo sua solução vc tem três listas de inteiros List tecnologias, List operadoras, List status

São estas listas que vc usa.

List<Dispositivo> dispositivos = new LinkedList<Dispositivo>();

    for(Integer tecnologia : listTecnologias){  
        for(Integer operadora : listOperadoras){  
            for(Integer status : listStatus){  
                Dispositivo  dispositivo  = new Dispositivo();

                dispositivo.setTecnologia(tecnologia);
                dispositivo.setOperadora(operadora);
                dispositivo.setStatus(status);

                dispositivos.add(dispositivo);
            }  
        }  
    }

Vc falou também de nulls e Is NULL, isso não faz muito sentido aqui. Parece que vc quer fazer um join na mão … talvez seja esse o problema…

P

Oi Sergio, valeu pela dica, consegui adaptar… agora estpu vendo como passar apenas uma lista para DAO…

Só que estou preso a esta questão do Nulo… não entendi seu comentário sobre fazer um Join na mão…

vamos resumir o que está atualmente:

Existe uma JSP com tres campos de lista, onde estes podem ou Não, virem com valores…

Faço a verificação se possuem valores em uma classe, e monto as listas…

Destas listas… seguindo o conselho do Sergio, adciono os valores das 3 listas em uma (Dispositivo)

Agora na minha DAO, onde tratava as 3 listas para adicionar as condiçoes de acordo se existia valores preciso tentar ver uma forma de receber apenas uma lista e montar o SQL…

Não posso usar isso:

sql.append("(Dispositivo.CodigoTecnologia  =  ? and AND SIMCard.CodigoOperadora = ? and Linha.CodigoStatusLinha = ? )"   
sql.append (" OR ")

Pois podem não possuir valores…

Por isso eu estava usando este tipo de condição :

if ( !tecnologias.isEmpty() ) {   
            sql.append(" AND Dispositivo.CodigoTecnologia IN (");   
            for(Integer i : tecnologias) {   
                if (tecnologias.isEmpty()){   
                    sql.append("?");   
                } else {   
                    sql.append("?,");   
                }   
            }   
          }

Pois se existir valor adiciono a condição de consulta…

sergiotaborda

Pacato:
Oi Sergio, valeu pela dica, consegui adaptar… agora estpu vendo como passar apenas uma lista para DAO…

Só que estou preso a esta questão do Nulo… não entendi seu comentário sobre fazer um Join na mão…

Vc tem que esxplicar porque raios a lista pode estar vazia. Tem que explicar concretamente o que vc está tentando fazer : qual é a regra ?
O que a pesquisa realmente deve retornar ?

eu havia entendido que deveria retornar todos os dispositivos que tivesse a combinação correta de tecnologia, operadora e status. Mas se um deles pode ser nulo, então não é isso que vc está procurando.

P

Desculpe Sergio… acho que não me expressei direito…

na tela do jsp

Então pode ser que escolham todos, de todos os campos, como um de cada, ou apenas um de um só bloco…

ai minha situação está, ja consigo pegar estes valores, e adicionar nas listas de inteiros, pois entrarão como texto, mas os converto em códigos…

agora mandar para a dao que está assim:

StringBuilder sql = new StringBuilder("");
			
	public List<ConsultaGerarRelatorio> listaTecnologias(List<Integer> tecnologias, List<Integer> operadoras, List<Integer> status){
		Connection conn = null;
		PreparedStatement ps = null;
		
		System.out.println(tecnologias);
		
// AQUI VERIFICO SE VEIO VALOR, SE VEIO ADICIONO A CONDIÇÃO

		if ( !tecnologias.isEmpty() ) {
		    sql.append(" AND Dispositivo.CodigoTecnologia = ? ");
		    
		  }

		  if ( !operadoras.isEmpty() ) { 
		  sql.append(" AND SIMCard.CodigoOperadora = ? ");
		    
		  }
		  
		  if ( !status.isEmpty() ) { 
		  sql.append(" AND Linha.CodigoStatusLinha = ? ");
		    
		  }
		
		  try { 

// AQUI ESTA ENVIANDO NO PS.... SÓ QUE SEM COMBINAR NADA... APENAS SEGUINDO UMA ORDEM DE ENTRADA DE VALORES

			  conn = ConnectionManager.obterConexao();
			  ps = conn.prepareStatement(SQL_+sql.toString());
		
			  int indicePs = 1; // ou zero, nunca lembro o primeiro
			  if ( !tecnologias.isEmpty() ) {
			    for(Integer i : tecnologias) {
			      ps.setInt(indicePs++, i);
			      System.out.println("primeiro i: "+i);
			    }
			  }
			  if ( !operadoras.isEmpty() ) {
			    for(Integer i : operadoras) {
			      ps.setInt(indicePs++, i);
			      System.out.println("segundo i: "+i);
			    }
			  }
			  if ( !status.isEmpty() ) {
			    for(Integer i : status) {
			      ps.setInt(indicePs++, i);
			      System.out.println("terceiro i: "+i);
			    }
			  }

Ficou mais claro? desculpe novamente se não me expressei direito

sergiotaborda

Agora entendi melhor seu problema. Esqueca o que eu falei do dispositivo.

O que vc precisa é dar um IN em cada campo dos elementos que usuário escolher , se ele escolheu algum.

if ( !tecnologias.isEmpty() ) {  
            sql.append(" Dispositivo.CodigoTecnologia IN (");  
            for(Integer i : tecnologias) {  
                    sql.append("?,");  
            }  
  }

Veja que não ha if no for. A lista não está vazia. Então todos os elementos são adicionados.
E o primeiro if, é usado para saber se pomos a regra ou não

Vc quer todos os dispositivos que satisfaçam alguma das condições ou todas ao mesmo tempo?
Se for o primeiro caso vc precisa usar OR, senão AND.

O select já vai realizar a combinação de que falou no inicio.

Por exemplo se o cara escolher apenas TIm e OI com status Ativo a query seria

Where operadora in ( ? , ? ) AND status IN( ?)

Veja que não ha nulls poque eles não aparecem. Quand for setar os ps , é só setar na mesma ordem que criou o sql…

P

Isso Sergio…

Duas coisas apenas, a primeira é que precisa ter um if a mais para quando for o último registro colocar o “)” para fechar a condição do IN e tirar a última vírgula

A segundo eu preciso fazer assim, as combinações dos valores…

Por exemplo:

como falei no primeiro post, se tenho 2 tecnologias selecionadas, e 2 operadoras e 2 status:

Tecnologia 1
Operadora 1
Status 1

depois

Tecnologia 1
Operadora 2
Status 1

depois

Tecnologia 1
Operadora 1
Status 2

depois 2ª tecnologia…

Tecnologia 2
Operadora 1
Status 1

assim por diante…

Tenho que combinar os selects de acordo com a seleção do inicio, podendo ter valro apenas em uma das box como em todas, ai pego o valor de cada uma e vou fazendo essa manipulação

sergiotaborda

Pacato:
Isso Sergio…

Duas coisas apenas, a primeira é que precisa ter um if a mais para quando for o último registro colocar o “)” para fechar a condição do IN e tirar a última vírgula

humm… use iterator para isso

if ( !tecnologias.isEmpty() ) {    
             sql.append(" Dispositivo.CodigoTecnologia IN (");    
               for(Iterator<Integer> it = tecnologias.iterator(); it.hasNext();) {        
                        it.next() // avança, não precisa usar o valor aqui
                       sql.append("?");    
                       if ( it.hasNext(){
                              sql.append(",");
                       }   
            }    
    }

Faça o teste e veja se o in não resolve isso. Na minha cabeça resolve. Ele já vai trazer todas as combinações… Mas se não for assim, alguém que ajude ai porque não estou vendo pq.

P

Oi Sergio, valeu pela ajuda

Ele não faz cominações… mas vou vendo aqui… muito obrigado mesmo…

Eu acho que quando estou tentando preencher as listas assim (abaixo) só está passando o último valor…

List<Integer> tecnologias = null;

for (String mult : Multicodigos){
if(mult.contains("Alarmes") || mult.contains("Alarmes 2") || mult.contains("Alarmes 3") 
					|| mult.contains("Alarmes 4") || mult.contains("Alarmes 5")){
				
				if (mult.contains("Alarmes")){
					cod = 22; 
				} else if (mult.contains("Alarmes 2")) {
					cod = 26; 
				} else if (mult.contains("Alarmes 3")){
					cod = 24;
				} else if (mult.contains("Alarmes 4")){
					cod = 25;
				} else {
					cod = 23;
				}
			}	
				System.out.println("Tecnologia: " + cod);								
				
				//CRIA LISTA DE TECNOLOGIAS
				tecnologias = Arrays.asList(cod);

Ou estou enviando errado só fazendo isso:

for (Integer a : tecnologias){
			for (Integer b : operadoras){
				for (Integer c : status){
					System.out.println("Tecnologia mandada: "+ tecnologias);
					System.out.println("Operadora mandada: "+ operadoras);
					System.out.println("Status mandada: "+ status);
					
					dao.listaTecnologias(tecnologias, operadoras, status);		
					
				}
			}
		
	}

Abraços…

sergiotaborda

Achei que tinha falado isso antes, mas não falei. Porque algumas listas podem ser vazias, esse for triplo não funciona. Imagine que a lista de tecnologias é vazia. Os for internos nunca serão executados.
Vc tem que passas as listas inteiras e fazer aquele if que falei antes para cada um delas juntando o pedaço de sql de cada uma com AND ou OR conforme falei antes.

P

Entendo...

mas acho que esse jeito que estou fazendo para popular a lista esta errado, pq ele só passa o último valor....

Isso esta certo de popular a lista? eu deixo um for enquanto ele passa todos os valores recebidos de parametro, e ele entra em cada condição IF de acordo com a palavra, para eu colocar o codigo respectivo.

ai pego esse código e paaso para a lista:

tecnologias = Arrays.asList(cod);

sobre os ifs de colocar o AND, ele faz isso na DAO:

Um deles
public List<ConsultaGerarRelatorio> listaTecnologias(List<Integer> tecnologias, List<Integer> operadoras, List<Integer> status){
		Connection conn = null;
		PreparedStatement ps = null;				
								
		if ( !tecnologias.isEmpty() ) {       
	         sql.append(" AND Dispositivo.CodigoTecnologia IN (");       
	           for(Iterator<Integer> it = tecnologias.iterator(); it.hasNext();) {
	        	   System.out.println(tecnologias);
	                   it.next();   
	                   sql.append("?) ");       
	                   if ( it.hasNext()){   
	                          sql.append(",");   
	                   }
	           }
		}
sergiotaborda

Pacato:
Entendo…

mas acho que esse jeito que estou fazendo para popular a lista esta errado, pq ele só passa o último valor…

Isso esta certo de popular a lista?

Não.

List<Integer> tecnologias = new ArrayList<Integer>();  
      
    for (String mult : Multicodigos){  
    if(mult.contains("Alarmes") || mult.contains("DAF") || mult.contains("TM PORTO")   
                        || mult.contains("Nanocomm") || mult.contains("DAF VII")){  
                      
                    if (mult.contains("Alarmes")){  
                        cod = 22;   
                    } else if (mult.contains("DAF VII")) {  
                        cod = 26;   
                    } else if (mult.contains("TM PORTO")){  
                        cod = 24;  
                    } else if (mult.contains("Nanocomm")){  
                        cod = 25;  
                    } else {  
                        cod = 23;  
                    }  
                }     
                    System.out.println("Tecnologia: " + cod);                                 
                      
                    //Adiciona na LISTA DE TECNOLOGIAS  
                    tecnologias.add(cod);
     }
A

.

P

Valeu Sergio consegui popular as listas com o “new ArrayList();”

Esta com erro de lógica quando estou tentando montar os indices…

escolhi um registro de cada…

try { 
		
			  conn = ConnectionManager.obterConexao();
			  ps = conn.prepareStatement(SQL_+sql.toString()+GROUP);
		
			  int indicePs = 0;// SE EU DEIXO COMO 1 ELE ENTRA NO PRIMEIRO indice  SOMANDO e fica como 2
			  if ( !tecnologias.isEmpty() ) {
			    for(Integer i : tecnologias) {
			      ps.setInt(indicePs++, i);
			      System.out.println("Primeiro i: "+i);
			    }
			  }
			  if ( !operadoras.isEmpty() ) {
			    for(Integer i : operadoras) {
			      ps.setInt(indicePs++, i);
			      System.out.println("Segundo i: "+i);
			    }
			  }
			  if ( !status.isEmpty() ) {
			    for(Integer i : status) {
			      ps.setInt(indicePs++, i);
			      System.out.println("Terceiro i: "+i);
			    }
			  }

Erro:

org.postgresql.util.PSQLException: O índice da coluna está fora do intervalo: 0, número de colunas: 1.
P

CONSEGUI :D

ou Melhor CONSEGUIMOS

Valeu pela ajuda de todos.. principaalmente do Sergio, que com muita paciência ficou nessas duas semanas me ajudando... valeu mesmo...

Primeiro o conserto do erro... era na montagem do IN... ficou meio grande, mas não achei uma outra solução mais limpa... então uma das opções:

if ( !status.isEmpty() ) {       
			
			if( !tecnologias.isEmpty() || !operadoras.isEmpty() ) {
		         sql.append(" OR Linha.CodigoStatusLinha IN (");       
		           for(Iterator<Integer> it = status.iterator(); it.hasNext();) {
		        	   System.out.println(status);
		                   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();) {
		        	   System.out.println(status);
		                   it.next();   
		                   sql.append("?");       
		                   if ( it.hasNext()){   
		                          sql.append(",");   
		                   }     
		           }
		           sql.append(")");
		}
		}

Assim, ele vai acresentando "?" se tiver próximo coloca "," e quando sai do for fecha o parenteses....

P

Agora a solução desde a verificação da lista…

Aqui recebo a lista do JSP, e trato os campos com o que eu quero… que no caso é converte-los em códigos para enviar para consultar no BD…

public void 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("Alarmes") || mult.contains("Alarmes 2") || mult.contains("Alarmes 3") 
                    || mult.contains("Alarmes 4") || mult.contains("Alarmes 5")){
                
                if (mult.contains("Alarmes")){
                    cod = 22; 
                } else if (mult.contains("Alarmes 2")) {
                     cod = 26; 
                } else if (mult.contains("Alarmes 3")){
                    cod = 24;
                } else if (mult.contains("Alarmes 4")){
                    cod = 25;
                 } else {
                    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") ){
                    
                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);
                
            }        
            
        }
        
        //ENVIO As LISTAs PARA CONSULTAR
        dao.listaTecnologias(tecnologias, operadoras, status);

Na DAO recebo as listas e faço o incremento dos campos… e monto o sql:

public class GeraRelatorioDAO {

	private static final String SQL_ = "SELECT DISTINCT (Dispositivo.CodigoTecnologia) AS CodTecnologia, "
			+ "(SIMCard.CodigoOperadora) AS Operadora, "
			+ "(Linha.CodigoStatusLinha) AS StatusLinha, "
			+ "COUNT(*) as Quantidade "
			+ "FROM SIMCard, Dispositivo, Linha, SIMCardDispositivo "
			+ "WHERE Linha.Numero = SIMCard.NumeroLinha "
			+ "AND SIMCard.Numero = SIMCardDispositivo.SIMCard_Numero "
			+ "AND SIMCardDispositivo.Dispositivo_Numero = Dispositivo.Numero "
			+ "AND (";
	
	private static final String GROUP = " GROUP BY CodTecnologia, Operadora, StatusLinha "
			+ "ORDER BY CodTecnologia";
	
	StringBuilder sql = new StringBuilder("");
			
	public List<ConsultaGerarRelatorio> listaTecnologias(List<Integer> tecnologias, List<Integer> operadoras, List<Integer> status){
		Connection conn = null;
		PreparedStatement ps = null;				
								
		if ( !tecnologias.isEmpty() ) {       
	         sql.append(" Dispositivo.CodigoTecnologia IN (");       
	           for(Iterator<Integer> it = tecnologias.iterator(); it.hasNext();) {
	        	   System.out.println(tecnologias);
	                   it.next();   
	                   sql.append("?");       
	                   if ( it.hasNext()){   
	                          sql.append(",");   
	                   }
	           }
	           sql.append(")");
		}
		
		if ( !operadoras.isEmpty() ) {  
			
			if( !tecnologias.isEmpty() ) {
				sql.append(" OR SIMCard.CodigoOperadora IN (");       
		           for(Iterator<Integer> it = operadoras.iterator(); it.hasNext();) {
		        	   System.out.println(operadoras);
		                   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();) {
		        	   System.out.println(operadoras);
		                   it.next();   
		                   sql.append("?");       
		                   if ( it.hasNext()){   
		                          sql.append(",");   
		                   }     
		           }
		           sql.append(")");
			}
		}
		
		if ( !status.isEmpty() ) {       
			
			if( !tecnologias.isEmpty() || !operadoras.isEmpty() ) {
		         sql.append(" OR Linha.CodigoStatusLinha IN (");       
		           for(Iterator<Integer> it = status.iterator(); it.hasNext();) {
		        	   System.out.println(status);
		                   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();) {
		        	   System.out.println(status);
		                   it.next();   
		                   sql.append("?");       
		                   if ( it.hasNext()){   
		                          sql.append(",");   
		                   }     
		           }
		           sql.append(")");
		}
		}

		  sql.append(" )"); 
		
		  System.out.println(SQL_+sql.toString()+GROUP);
		  
		  try { 
		
			  conn = ConnectionManager.obterConexao();
			  ps = conn.prepareStatement(SQL_+sql.toString()+GROUP);
		
			  int indicePs = 1;
			  if ( !tecnologias.isEmpty() ) {
			    for(Integer i : tecnologias) {
			      ps.setInt(indicePs++, i);
			      System.out.println("indice: "+indicePs);
			      System.out.println("Primeiro i: "+i);
			    }
			  }
			  if ( !operadoras.isEmpty() ) {
			    for(Integer i : operadoras) {
			      ps.setInt(indicePs++, i);
			      System.out.println("Segundo i: "+i);
			    }
			  }
			  if ( !status.isEmpty() ) {
			    for(Integer i : status) {
			      ps.setInt(indicePs++, i);
			      System.out.println("Terceiro i: "+i);
			    }
			  }
			  
		  
			  
			  System.out.println("Consulta: " + SQL_ + sql.toString() + GROUP);
			  
			  	String codTecnologia;
				String operadora;
				String statusLinha;
				String quantidade;
				
			  
			  
				ResultSet rs = ps.executeQuery();

				while (rs.next()) {

					codTecnologia = rs.getString("CodTecnologia");
					operadora = rs.getString("Operadora");
					statusLinha = rs.getString("StatusLinha");
					quantidade = rs.getString("Quantidade");

					System.out.println(codTecnologia + " " + 
							operadora + " " + 
							statusLinha + " " +
							quantidade);		

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

}
Criado 5 de março de 2013
Ultima resposta 11 de mar. de 2013
Respostas 25
Participantes 5