Ajuda pesquisa SQL

seguinte tenho uma tabela cliente com id_cliente e nome_cliente e outra tabela venda com  id_venda e id_cliente

quero fazer uma consulta na tabela venda id_cliente pra me retornar o nome do cliente mas nao consigo fiz o seguinte

          public List<Cliente> listard(Integer id_cliente, Integer id_venda) {
        String sql = "SELECT nome_cliente FROM cliente WHERE cliente.id_cliente = ? and venda.id_cliente =?";
        try {
            PreparedStatement stmt = getConexao().prepareStatement(sql);
            
           stmt.setInt(1, id_cliente);
             stmt.setInt(2, id_venda);
            ResultSet rs = stmt.executeQuery();
            return getCliente(rs);
        } catch (SQLException sQLException) {
            System.out.println("Erro ao listar Cliente");
        }
        return null;
    }
        
}

ai a consulta no banco
ClienteDao cli = new ClienteDao();

Cliente fab = new Cliente();

cli.listard(11 , 3) ;

e aparece ("Erro ao listar Cliente") meu problema é no sql alguem ajuda ai

[quote=fabiodurgante][code]
seguinte tenho uma tabela cliente com id_cliente e nome_cliente e outra tabela venda com id_venda e id_cliente

quero fazer uma consulta na tabela venda id_cliente pra me retornar o nome do cliente mas nao consigo fiz o seguinte

      public List<Cliente> listard(Integer id_cliente, Integer id_venda) {
    String sql = "SELECT nome_cliente FROM cliente WHERE cliente.id_cliente = ? and venda.id_cliente =?";
    try {
        PreparedStatement stmt = getConexao().prepareStatement(sql);
        
       stmt.setInt(1, id_cliente);
         stmt.setInt(2, id_venda);
        ResultSet rs = stmt.executeQuery();
        return getCliente(rs);
    } catch (SQLException sQLException) {
        System.out.println("Erro ao listar Cliente");
    }
    return null;
}

}

ai a consulta no banco
ClienteDao cli = new ClienteDao();

Cliente fab = new Cliente();

cli.listard(11 , 3) ;

e aparece (“Erro ao listar Cliente”) meu problema é no sql alguem ajuda ai

[/code][/quote]

cara pra vc visualizar os erros sempre coloque o objeto Exception nas messagens de erro pra saber onde ta o erro

assim

System.out.println("Erro ao listar Cliente\n"+sQLException);

so vendo ai eu ja sei qual é o erro do Exception: collum id_cliente not found

ele nao encontrou a coluna id_cliente, entao quando vc passou o SELECT vc apenas expecificou uma coluna olha so

SELECT nome_cliente

tenta exibir todas com o *

        String sql = "SELECT * FROM cliente WHERE cliente.id_cliente = ? and venda.id_cliente =?"

ou entao pra ficar mas rapido a consulta somente as colunas que voce quer saber

        String sql = "SELECT id_cliente, id_venda FROM cliente WHERE cliente.id_cliente = ? and venda.id_cliente =?"

no teu sql vc tem que informar as tabelas que voce estara usando na busca das informações

teu sql ficaria assim

String sql = “SELECT A.nome_cliente FROM cliente A,venda B WHERE A.id_cliente = ? and B.id_cliente =? and B.id_cliente=?”;

Você não está fazendo a junção das tabelas…

Pela sua estrutura de tabela toda venda tem apenas um cliente, então é melhor você procurar só pelo código da venda…

fica mais ou menos asssim:

 select nome_cliente from venda v, cliente c where v.id_cliente=c.id_cliente and v.id_venda=4;  

retorna o nome do cliente na referia venda… tenta aí!

isso mesmo nao fiz a juncao e nao deu certo aqui assim
a tabela cliente tem o id_cliente autoincremento somente 1 id_cliente e na tabela venda o id_cliente vem da tabela cliente cada venda pode ser ealizada para um cliente logico
EXEMPLO o id_venda == 1 foi realizada pro id_cliente == 1 e esse id_cliente == 1 possu la nome clinte endereco do cliente e assim por diante so que nao sei usar isso ???

tenho a tabela venda que possui o id_cliente e o id_venda quero apartir desse id_cliente pegar o nome do cliente que esta na tabela cliente que possui o campo id_cliente e o campo nome_cliente
como afzer isso

Tenta ai:


"SELECT c.nome_cliente " +
"FROM TAB_CLIENTE c " +
"INNER JOIN TAB_VENDA v " + 
"ON v.id_cliente = c.id_cliente " +
"WHERE v.id_cliente = ? "+

Passa para o ? o id do cliente.

Abraço.

beleza meu fiz o seu codigo seguinte

  public List<Cliente> listard(Integer id_venda) {
       
           String sql = "SELECT * FROM cliente c INNER JOIN venda v ON v.id_cliente = c.id_cliente WHERE v.id_cliente = ? "; 
               
              // String sql = "select * from venda v, cliente c where v.id_cliente = c.id_cliente and v.id_venda = ?";  
        try {
            PreparedStatement stmt = getConexao().prepareStatement(sql);
            
           stmt.setInt(1, id_venda);
         
            ResultSet rs = stmt.executeQuery();
            return getCliente(rs);
            
        } catch (SQLException sQLException) {
            System.out.println("Erro ao listar Cliente" + sQLException);
        }
        return null;
    }


acho que é assim e depois pra min chama essa funcao

ClienteDao cli = new ClienteDao();

List<Cliente> lista = cli.listard(ven.getid_cliente());

     System.out.print(lista.toString()); 
fiz isso e o retorno é [modelo.Cliente@8814e9, modelo.Cliente@1503a3]

 nao sei que que é isso so que nao pegou o nome_cliente

onde ven.getid_vcliente()) pega o id_cliente da tabela venda e chamo a funcao mas e agora ta na lista 
que sera que deu errado??????

Repare nesse trecho de código:

String sql = "SELECT * FROM cliente c INNER JOIN venda v ON v.id_cliente = c.id_cliente WHERE v.id_cliente = ? ";   
                 
              // String sql = "select * from venda v, cliente c where v.id_cliente = c.id_cliente and v.id_venda = ?";     
        try {   
            PreparedStatement stmt = getConexao().prepareStatement(sql);   
               
           stmt.setInt(1, id_venda);  

Olhe o where:

WHERE v.id_cliente = ? "

Olha o que você passa por parametro:

stmt.setInt(1, id_venda);  

Outra coisa não utilize Select * quando for usar Inner Join, em junções grandes a consulta fica muito lenta, alias não use nunca Select *.

Abraço

Ahh e outra coisa, a saida me parece estranha por que uma lista pode conter muitos elementos, como ela vai saber do qual você está se referindo ??

Faz um cast para especializar a mesma, e nesse caso utilize ArrayList que se enquadra melhor.

Assim olha, você tem essas classes:

ClienteBean
ClienteDao

E um objeto do tipo ArrayList

ArrayList listClientes = cli.listard(ven.getid_cliente());   

//percorre a lista toda recuperando os elementos
for(int i=0; i<listClientes.size(); i++) {

   clienteBean = (ClienteBean) listClientes.get(i);
 
   //aqui você consegue visualizar os metodos proprios do objeto cliente, vamos supor que tenha um    
  // metodo getNome

   System.out.println(clienteBean.getNome());

}

Mude o where do select no ClienteDao para id_venda no lugar de id_cliente

Até.

consegui cara fiz o seguinte

 public String listard(Integer id_venda) {

      String sql = "SELECT * FROM cliente c INNER JOIN venda v ON v.id_cliente = c.id_cliente WHERE v.id_venda = ? "; 
     
        try {
            PreparedStatement stmt = getConexao().prepareStatement(sql);
           stmt.setInt(1, id_venda);      
            ResultSet rs = stmt.executeQuery(); 
       rs.next();
     return  rs.getString("nome_cliente");

            
        } catch (SQLException sQLException) {
            System.out.println("Erro ao listar Cliente" + sQLException);
        }
        return null;
    }

me retorna direto a string com o nome do usuario da tabela cliente apartir do codigo do usuario da tabela venda
ClienteDao cli = new ClienteDao();
 cli.listard(ven.getid_venda())
ai perfeito 

VALEU AI A TODOS VALEU!!!!!!!!!!!

Agora sim, retornando uma String fica melhor, só falta tirar o SELECT * de lá e colocar nome_cliente no lugar.

Abraço