Duvida com consulta sql

Ola a todos =D

eu consegui com sucesso efetuar consulta a um banco de dados mysql chamando uma funcao dessa forma


vendedores = dao.getLista("%" + jTFCVPesquisa.getText() + "%");

funcao chamada


 public List<Vendedor> getLista(String nome) throws SQLException {
        String sql = "select * from vendedor where ? like ?";
        PreparedStatement stmt = this.conexao.prepareStatement(sql);
        stmt.setString(1, nome); 
        ResultSet rs = stmt.executeQuery();
        
        

        List<Vendedor> minhaLista = new ArrayList<Vendedor>();
        while (rs.next()) {
            Vendedor v1 = new Vendedor();
            v1.setId(Long.valueOf(rs.getString("Id")));
            v1.setRg(rs.getString("rg"));
            v1.setCpf(rs.getString("cpf"));
            v1.setNome(rs.getString("nome"));
            v1.setEndereco(rs.getString("endereco"));
            v1.setTelefone(rs.getString("telefone"));
            v1.setData_admissao(rs.getString("data_admissao"));
            v1.setData_demissao(rs.getString("data_demissao"));
            minhaLista.add(v1);
        }
        rs.close();
        stmt.close();
        return minhaLista;

agora o que eu queria fazer eh utilizar um jTextField (ou um combobox) para que seja selecionado em qual coluna da minha tabela deve ser usada para pesquisa (pesquisar por nome, ou rg ou cpf ou msm id)

eu chamaria a funcao da seguinte forma

vendedores = dao.getLista("%" + jTFCVPesquisa.getText() + "%", jTColuna.getText());

e faria a seguinte mudanca na funcao chamada

public List<Vendedor> getLista(String nome, String coluna) throws SQLException {
        String sql = "select * from vendedor where ? like ?";
        PreparedStatement stmt = this.conexao.prepareStatement(sql);
        stmt.setString(1, coluna);
        stmt.setString(2, nome); 
        ResultSet rs = stmt.executeQuery();
//e o resto continua igual

porem da o erro
Exception in thread “AWT-EventQueue-0” java.lang.IndexOutOfBoundsException: Index: 17, Size: 0
at java.util.ArrayList.RangeCheck(ArrayList.java:547)
at java.util.ArrayList.get(ArrayList.java:322)
at otica.forms.jTPrincipal.jTVendedorLinhaSelecionada(jTPrincipal.java:924)
at otica.forms.jTPrincipal.access$700(jTPrincipal.java:36)
at otica.forms.jTPrincipal$7.valueChanged(jTPrincipal.java:492)
at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:167)
at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:147)
at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:194)
at javax.swing.DefaultListSelectionModel.removeIndexInterval(DefaultListSelectionModel.java:660)
at javax.swing.JTable.tableRowsDeleted(JTable.java:4497)
at javax.swing.JTable.tableChanged(JTable.java:4400)
at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280)
at javax.swing.table.AbstractTableModel.fireTableRowsDeleted(AbstractTableModel.java:245)
at javax.swing.table.DefaultTableModel.removeRow(DefaultTableModel.java:447)
at otica.forms.jTPrincipal.mostraPesquisav(jTPrincipal.java:942)
at otica.forms.jTPrincipal.listarVendedores(jTPrincipal.java:58)
at otica.forms.jTPrincipal.jBCVPesquisarActionPerformed(jTPrincipal.java:780)
at otica.forms.jTPrincipal.access$500(jTPrincipal.java:36)
at otica.forms.jTPrincipal$6.actionPerformed(jTPrincipal.java:483)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6263)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6028)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
BUILD SUCCESSFUL (total time: 15 seconds)

alguma ideia?
grato desdeja

Jhow teu brema é de boa pra resolver.
Vamo resolver essa paradinha pra ti e é agora fera.
Mas vo só te dar as dicas. Dae tu tenta se virar sozinho. Esse é o grande segredo de se aprender.
Seguinte.
Pelo jeito tu tem mais de um vendedor no banco certo?
Se sua resposta foi “sim” então o lance é o seguinte.
Esse Index_de_não_sei_o_que é um erro que dá quando se ultrapassa o limite de um vetor.
Dae tu pode por um while pra sanar esse brema.

Vo te dar um exemplo simples.

ublic List<Contato> getLista(){
		
		try{
			List<Contato> contatos = new ArrayList<Contato>();
			PreparedStatement stmt = this.connection.prepareStatement("select * from contatos");
			ResultSet rs = stmt.executeQuery();
			
			while(rs.next()){
				//criando o objeto Contato
				Contato contato = new Contato();
				contato.setNome(rs.getString("nome"));
				
				//montando a data atavés de Calendar
				Calendar data = Calendar.getInstance();
				data.setTime(rs.getDate("dataNascimento"));
				contato.setDataNascimento(data);
				
				//adicionando objeto a lista
				contatos.add(contato);
			}
			rs.close();
			stmt.close();
			return contatos;
		}catch(SQLException e){
			throw new RuntimeException(e);
		}

Dae no main tu coloca o seguinte…

ContatoDAO dao = new ContatoDAO();
		
		List<Contato>contatos=dao.getLista();
		
		for (Contato contato:contatos){
			System.out.println("Nome:" +contato.getNome());
		}

Espero ter te ajudado ferinha.
Boa sorte jhow.
Espero ter ajudado. Flwz.

vlw msm a ajuda fera
eu vo ver direitinho o exemplo e tentar aplicar aki
mas pelo q eu vi o seu while faz a msm coisa q o o do meu exemplo nao? (linha 10)
e ele funciona ja no meu exemplo da seguinte forma

public List<Vendedor> getLista(String nome) throws SQLException {
        String sql = "select * from vendedor where nome like ?";
        PreparedStatement stmt = this.conexao.prepareStatement(sql);
        stmt.setString(1, nome);
        ResultSet rs = stmt.executeQuery();

nesse caso eu chamo a funcao passando o conteudo de um jTextField
pois quero pesquisar os registros da tabela “vendedor” atraves do nome por exemplo

mas eu gostaria que pudesse ser feita a pesquisa em outros campos tb a ser selecionado pelo usuario

entao tentei da seguinte forma

public List<Vendedor> getLista(String nome, String coluna) throws SQLException {
        String sql = "select * from vendedor where ? like ?";
        PreparedStatement stmt = this.conexao.prepareStatement(sql);
        stmt.setString(1, coluna);
        stmt.setString(2, nome);
        ResultSet rs = stmt.executeQuery();

e dessa vez chamo a funcao passando no coluna a coluna q eu desejo pesquisar e no nome o valor a ser pesquisado\

ele ate compila sem erros e se eu pesquiso sem preencher as colunas ele nao retorna erros, porem da erro se eu faco uma pesquisa que deveria retornar resultados.
lembrando q no primeiro caso onde a minha string sql eh select * from vendedor where nome like ?
funciona.
eu nao sei c realmente essa forma de tratar o string sql funciona, select * from vendedor where ? like ?

funcionou da seguinte forma

 public List<Vendedor> getLista(String coluna, String nome) throws SQLException {
        String sql = "select * from vendedor where "+ coluna + " like '"+ nome+"';";
        System.out.println(sql);
        PreparedStatement stmt = this.conexao.prepareStatement(sql);
        //stmt.setString(1, coluna);
        //stmt.setString(2, nome);
        ResultSet rs = stmt.executeQuery();
        
        


        List<Vendedor> minhaLista = new ArrayList<Vendedor>();
        
        while (rs.next()) {
            Vendedor v1 = new Vendedor();
            v1.setId(Long.valueOf(rs.getString("Id")));
            v1.setRg(rs.getString("rg"));
            v1.setCpf(rs.getString("cpf"));
            v1.setNome(rs.getString("nome"));
            v1.setEndereco(rs.getString("endereco"));
            v1.setTelefone(rs.getString("telefone"));
            v1.setData_admissao(rs.getString("data_admissao"));
            v1.setData_demissao(rs.getString("data_demissao"));
            minhaLista.add(v1);
        }
        rs.close();
        stmt.close();
        return minhaLista;

    }

sendo chamado dessa forma

vendedores = dao.getLista(jTextField1.getText(),"%"+jTFCVPesquisa.getText()+"%");

mas nao keria fazer dessa forma
e sim usando no select ?
e os stmt.setString

bom descobri q usando

  public List<Vendedor> getLista(String coluna, String nome) throws SQLException {
String sql = "select * from vendedor where ? like ?;";
PreparedStatement stmt = this.conexao.prepareStatement(sql);
stmt.setString(1, coluna);
stmt.setString(2, nome);
ResultSet rs = stmt.executeQuery();

a sql gerada seria isso
select * from vendedor where ‘nome’ like ‘%chuck%’;
(caso eu envie nome para ser recebida por coluna e %chuck% para ser recebido pela string nome)
por isso a pesquisa nao dava certo
entao o mais proximo q eu cheguei doke eu quero eh isso

 public List<Vendedor> getLista(String coluna, String nome) throws SQLException {
       // String sql = "select * from vendedor where "+ coluna + " like '"+ nome+"';";
        String sql = "select * from vendedor where "+coluna+" like ?;";
         PreparedStatement stmt = this.conexao.prepareStatement(sql);
        stmt.setString(1, nome);
        ResultSet rs = stmt.executeQuery();

dessa forma funciona!
porem nao sei se eh a abordagem mais correta ou se eh apenas uma gambiarra
agradeceria uma luz agora =D

POG (Programação Orientada a Gambiarra) faz parte.
(risos)

E agora José? A mufa queimou, solução você não arrumou e agora?
Apague a luz e durma quando isso acontecer.

Fiz isso e acho que deu certo.

Seguinte…

No teu código você colocou…

stmt.executeQuery();

Tenta por apenas o execute e me diz o que retorna.

Ex:

stmt.execute();

Oks?

Espero que dê certo. :smiley:

entao fera
o problema nao ta no executequery
e sim na minha string sql para consulta e nos stmt.setString
dessa maneira q eu fiz deu certo
porem nao sei se eh apenas gambiarra ou se esta eh a forma adequada