Select com IN

boa noite, tenho um problema de exceção.

veja o código abaixo:

public ArrayList<Usuarios> BuscaUsuariosInEmail(String encaminhamento){ try{ conect.Connect(); pst = conect.con.prepareStatement("SELECT EMAIL " +"FROM USUARIOS u " + "WHERE COD_SETOR IN (?)"); pst.setString(1, encaminhamento); ResultSet rs = pst.executeQuery(); users = new ArrayList<>(); while (rs.next()) { Usuarios a = new Usuarios(); a.setEmailUsuario(rs.getString("EMAIL")); users.add(a); } conect.Fecha(); }catch(SQLException e){ JOptionPane.showMessageDialog(null, "erro ao tentar buscar: "+e); } return users; }

até parece que está tudo certo, mas quando a variavel String encaminhamento recebe valores como 1,4 dá erro de conversao Int.

mensagem de erro: org.firebirdsql.jdbc.field.TypeConvertionException: Error converting to int 1,4

obrigado

Quando você diz “1,4” quer dizer setor 1 e setor 4 certo?
Acontece que não é assim que funciona o PreparedStatement.

Cada símbolo ? representa 1 e apenas 1 parâmetro.
Se você quer passar 1 e 4, seu in deveria ficar “IN (?,?)”

ahhhhhhhhhhhhhhhhh!

vou fazer o teste valeu

fiz uma gambiarra e deu certo!

segue abaixo:

public ArrayList<Usuarios> BuscaUsuariosInEmail(String encaminhamento){ try{ conect.Connect(); pst = conect.con.prepareStatement("SELECT EMAIL " +"FROM USUARIOS u " + "WHERE COD_SETOR IN ("+encaminhamento+")"); //pst.setString(1, encaminhamento); ResultSet rs = pst.executeQuery(); users = new ArrayList<>(); while (rs.next()) { Usuarios a = new Usuarios(); a.setEmailUsuario(rs.getString("EMAIL")); users.add(a); } conect.Fecha(); }catch(SQLException e){ JOptionPane.showMessageDialog(null, "erro ao tentar buscar: "+e); } return users; }

Boa noite pessoal, me deparei com uma situação um pouco mais dificil, gostaria de uma opiniao.

Estou tentando fazer um select da seguinte maneira:

public ArrayList<Ocorrencias> BuscaOcorrencias(){ String encaminhamento = "1"; try{ conect.Connect(); pst = conect.con.prepareStatement("SELECT o.id_ocorrencia,ni.nome_paciente,ad.nome_agravo_doenca,odg.data_ocorrencia,odo.hora_ocorrencia,o.datahora " +"FROM OCORRENCIAS o " +"LEFT JOIN O_AGRESSOR oa ON o.id_ocorrencia = oa.id_ocorrencia " +"LEFT JOIN o_consequencia oc ON o.id_ocorrencia = oc.id_ocorrencia " +"LEFT JOIN O_DADOS_GERAIS odg ON o.id_ocorrencia = odg.id_ocorrencia " +"LEFT JOIN AGRAVO_DOENCA ad ON odg.id_agravo_doenca = ad.id_agravo_doenca " +"LEFT JOIN o_dados_ocorrencia odo ON o.id_ocorrencia = odo.id_ocorrencia " +"LEFT JOIN O_ENCAMINHAMENTO oe ON o.id_ocorrencia = oe.id_ocorrencia " +"LEFT JOIN o_lesao ol ON o.id_ocorrencia = ol.id_ocorrencia " +"LEFT JOIN o_tipo_violencia otv ON o.id_ocorrencia = otv.id_ocorrencia " +"LEFT JOIN o_v_sexual ovs ON o.id_ocorrencia = ovs.id_ocorrencia " +"LEFT JOIN notificacao_individual ni ON o.id_notif_indiv = ni.id_notificacao_individual " +"LEFT JOIN dados_pessoa_atendida dpa ON ni.id_notificacao_individual = dpa.id_notif_indiv " +"WHERE oe.ENC_OUTROS_SETORES IN ("+encaminhamento+") " + "ORDER BY o.id_ocorrencia DESC"); ResultSet rs = pst.executeQuery(); ocorrencias = new ArrayList<>(); while (rs.next()) { Ocorrencias a = new Ocorrencias(); a.setIDOcorrencia(rs.getInt("id_ocorrencia")); a.setNomePessoa(rs.getString("nome_paciente")); a.setNomeAgravo(rs.getString("nome_agravo_doenca")); a.setDataOcorrencia(rs.getDate("data_ocorrencia")); //a.setHoraOcorrencia(rs.getString("hora_ocorrencia")); String S = new SimpleDateFormat("MM/dd/yyyy").format(myTimestamp); a.setDataHoraOcorrencia(new SimpleDateFormat("dd/MM/yyyy HH:mm").format(rs.getTimestamp("datahora"))); ocorrencias.add(a); } conect.Fecha(); }catch(SQLException e){ JOptionPane.showMessageDialog(null, "erro ao tentar buscar: "+e); } return ocorrencias; }

mas está dando o tal erro de converting String na parte do IN novamente, só que agora dentro de “ENC_OUTROS_SETORES” tenho os seguintes dados “1,4,6,7”, preciso comparar esses dados cadastrados com a variavel “encaminhamento” que recebe o valor “1” é possivel???

Obrigado

Eu vejo muita gente com a mesma primeira dúvida que teve com o IN.
A sua solução na verdade acaba com todos os benefícios de se utilizar um PreparedStatement ao invés do Statement.
E esse é um dos poucos casos onde a resposta não é “depende” : use sempre PreparedStatement (da forma certa)!

Vou te mostrar um código que usaria pra esse tipo de situação (do tempo que não usava ORM):

        PreparedStatementHelper psh = new PreparedStatementHelper();
        
        boolean something = true;
        boolean anything = true;

        psh.startQuery("SELECT * FROM tabela WHERE");
        
        if (something) {
            int param1 = 1;
            psh.addToQuery("AND id = ? ", param1);
        }
        
        if (anything) {
            Collection&lt;Integer&gt; list = Arrays.asList(1, 2, 3);
            //repare que aqui tem um ?* ao invés de ? 
            psh.addInToQuery("AND valor IN ( ?* ) ", list );
        }

        Connection conn = null;
        PreparedStatement ps = conn.prepareStatement( psh.buildQuery() );
        psh.fill(ps).executeQuery();

Deixo por sua conta implementar o PreparedStatementHelper se tiver interessado.
Com isso não perde o benefício do PS mesmo quando precisa fazer queries condicionais (que vejo rolar muito por aqui).

Para sua segunda dúvida, acho que há um pequeno problema na sua modelagem.
Você não deveria ter um campo encaminhamento com vários valores, como “1,2,3”

O ideal seria ter nessa tabela várias linhas com o id_ocorrencia e o id_encaminhamento de cada.

Daí poderia um select como:

  id_ocorrencia IN (  SELECT id_ocorrencia FROM o_encaminhamento WHERE encaminhamento in ( ?* )  )

e remover a tabela O_Encaminhamento do JOIN.

Ou ainda adicionar essa query na definição do JOIN, talvez seria até mais performático, mas só medindo pra saber.

Show…

vou trabalhar nisso, posto aqui os resultados…

valeu mesmo!

Boa tarde estou tentando fazer da sequinte maneira:

public ArrayList<Ocorrencias> BuscaOcorrencias(Integer CodSetor){ try{ conect.Connect(); pst = conect.con.prepareStatement("SELECT o.id_ocorrencia,ni.nome_paciente,ad.nome_agravo_doenca,o.datahora " +"FROM OCORRENCIAS o " +"LEFT JOIN O_DADOS_GERAIS odg ON o.id_ocorrencia = odg.id_ocorrencia " +"LEFT JOIN AGRAVO_DOENCA ad ON odg.id_agravo_doenca = ad.id_agravo_doenca " +"LEFT JOIN notificacao_individual ni ON o.id_notif_indiv = ni.id_notificacao_individual " +"WHERE ? IN (SELECT eos.setor FROM ENC_OUTROS_SETORES eos WHERE eos.id_ocorrencia = o.id_ocorrencia) " +"ORDER BY o.id_ocorrencia DESC "); pst.setInt(1, CodSetor); ResultSet rs = pst.executeQuery(); ocorrencias = new ArrayList<>(); while (rs.next()) { Ocorrencias a = new Ocorrencias(); a.setIDOcorrencia(rs.getInt("id_ocorrencia")); a.setNomePessoa(rs.getString("nome_paciente")); a.setNomeAgravo(rs.getString("nome_agravo_doenca")); a.setDataHoraOcorrencia(new SimpleDateFormat("dd/MM/yyyy HH:mm").format(rs.getTimestamp("datahora"))); ocorrencias.add(a); } conect.Fecha(); }catch(SQLException e){ System.out.println(e); } return ocorrencias; }

mas dá o seguinte erro:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544569. Dynamic SQL Error SQL error code = -804 Data type unknown

só dá certo quando faço direto:

[code] public ArrayList BuscaOcorrencias(Integer CodSetor){
try{
conect.Connect();
pst = conect.con.prepareStatement("SELECT o.id_ocorrencia,ni.nome_paciente,ad.nome_agravo_doenca,o.datahora "
+"FROM OCORRENCIAS o "
+"LEFT JOIN O_DADOS_GERAIS odg ON o.id_ocorrencia = odg.id_ocorrencia "
+"LEFT JOIN AGRAVO_DOENCA ad ON odg.id_agravo_doenca = ad.id_agravo_doenca "
+"LEFT JOIN notificacao_individual ni ON o.id_notif_indiv = ni.id_notificacao_individual "
+"WHERE “+CodSetor+” IN (SELECT eos.setor FROM ENC_OUTROS_SETORES eos WHERE eos.id_ocorrencia = o.id_ocorrencia) "
+"ORDER BY o.id_ocorrencia DESC ");

        //pst.setInt(1, CodSetor);
        ResultSet rs = pst.executeQuery();  
        ocorrencias = new ArrayList<>();  
        while (rs.next()) {  
            Ocorrencias a = new Ocorrencias();  
            a.setIDOcorrencia(rs.getInt("id_ocorrencia")); 
            a.setNomePessoa(rs.getString("nome_paciente")); 
            a.setNomeAgravo(rs.getString("nome_agravo_doenca")); 
            a.setDataHoraOcorrencia(new SimpleDateFormat("dd/MM/yyyy HH:mm").format(rs.getTimestamp("datahora")));
            ocorrencias.add(a); 
        }
        conect.Fecha();
   }catch(SQLException e){
       System.out.println(e);
   }
   return ocorrencias;

}[/code]

qual é o problema será?

valeu