[RESOLVIDO] Recuperar dados após consulta com JOINS

Galera, eu consigo dar um SELECT no banco, usando JOIN desta maneira:

[code]public List listarProdutos() {
sql = “SELECT p.id, p.nome, p.preco, p.spec, p.qtd_estoque, c.id, c.nome, c.ativa FROM produto AS p JOIN categoria AS c ON p.categoria = c.id”;
try {
PreparedStatement stmt = this.connection.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();
List produtos = new ArrayList();

        while (rs.next()) {
            Produto produto = new Produto();
            produto.setCategoria(new Categoria());
            produto.setId(rs.getInt(1));
            produto.setNome(rs.getString(2));
            produto.setPreco(rs.getDouble(3));
            produto.setEspecificacao(rs.getString(4));
            produto.setQtdEstoque(rs.getInt(5));
            produto.getCategoria().setId(rs.getInt(6));
            produto.getCategoria().setNome(rs.getString(7));
            produto.getCategoria().setAtiva(rs.getBoolean(8));
            produtos.add(produto);
        }

        rs.close();
        stmt.close();
        return produtos;
    } catch (SQLException e) {
        throw new RuntimeException(e);
    }[/code]

Mas quando eu não uso o JOIN eu do um SELECT assim:

[code]public List listarProdutoPorNome(String nomeDoProduto) {
sql = “SELECT * FROM produto WHERE nome LIKE '” + nomeDoProduto + “%’”;

    try {
        PreparedStatement stmt = this.connection.prepareStatement(sql);
        ResultSet rs = stmt.executeQuery();
        List<Produto> produtos = new ArrayList<Produto>();

        while (rs.next()) {
            Produto produto = new Produto();
            produto.setId(rs.getInt("id"));
            produto.setNome(rs.getString("nome"));
            produto.setEspecificacao(rs.getString("spec"));
            produto.setQtdEstoque(rs.getInt("qtd_estoque"));
            produto.setPreco(rs.getDouble("preco"));
            produtos.add(produto);
        }
        rs.close();
        stmt.close();
        return produtos;
    } catch (SQLException e) {
        throw new RuntimeException(e);
    }
}[/code]

A pergunta é: Porque quando eu dou um select desta maneira abaixo, usando o JOIN ele da erro na hora de recuperar os dados?

[code]public List listarProdutos() {
sql = “SELECT * FROM produto p JOIN categoria c ON p.categoria = c.id”;
try {
PreparedStatement stmt = this.connection.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();
List produtos = new ArrayList();

		while (rs.next()) {
			Produto produto = new Produto();
                            produto.setCategoria(new Categoria());
			produto.setId(rs.getInt("p.id"));
			produto.setNome(rs.getString("p.nome"));
			produto.setEspecificacao(rs.getString("p.spec"));
			produto.setQtdEstoque(rs.getInt("p.qtd_estoque"));
			produto.setPreco(rs.getDouble("p.preco"));
                            produto.getCategoria().setId(rs.getInt("c.id"));
                            produto.getCategoria().setNome(rs.getString("c.nome"));
                            produto.getCategoria().setAtiva(rs.getBoolean("c.ativa"));
			produtos.add(produto);
		}

		rs.close();
		stmt.close();
		return produtos;
	} catch (SQLException e) {
		throw new RuntimeException(e);
	}
}[/code]

O erro que da é este:

Exception in thread "main" java.lang.RuntimeException: org.postgresql.util.PSQLException: A nome da coluna p.id não foi encontrado neste ResultSet. at br.com.ecommerce.dao.ProdutoDAO.listarProdutos(ProdutoDAO.java:47) at br.com.ecommerce.dao.teste.TesteProdutoDAOSelect.main(TesteProdutoDAOSelect.java:12) Caused by: org.postgresql.util.PSQLException: A nome da coluna p.id não foi encontrado neste ResultSet. at org.postgresql.jdbc2.AbstractJdbc2ResultSet.findColumn(AbstractJdbc2ResultSet.java:2727) at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getInt(AbstractJdbc2ResultSet.java:2588) at br.com.ecommerce.dao.ProdutoDAO.listarProdutos(ProdutoDAO.java:32) ... 1 more Java Result: 1

Tem alguma maneira de recuperar os dados, usando JOIN, como no segundo exemplo, podendo dizer qual o dado que eu estou querendo e não de forma numerada, seguindo uma regra? tipo:rs.getString("p.nome")

No seu caso vc deve tirar o “p.” para recuperar os dados. Utilize apenas o nome da coluna. No caso de colunas com o mesmo nome em tabelas diferentes (p.id, c.id), no SELECT coloque um alias para a coluna “p.id as idProduto” e recupere “idProduto” no resultSet, dessa forma vc resolve seu problema.

Obrigado Fabio… Minha dúvida foi muito bem esclarecida… Bem idiota, mas não estava gostando da maneira como estava fazendo!

Cara, nenhuma dúvida é idiota, idiota é não perguntar qdo temos dúvidas!

“Aquele que pergunta, pode ser um tolo por cinco minutos. Aquele que deixa de perguntar, será um tolo para o resto da vida.” - Provérbio Chinês

Matou a charada, na verdade em qualquer linguagem de programação no resultado da consulta para mostrar os valores na tela
voce nao pode passar o nome da tabela junto por exemplo cmo vc fz

produto.setNome(rs.getString("[color=red]p.nome[/color]"));
produto.setEspecificacao(rs.getString("[color=red]p.spec[/color]"));

Pois é pra isso que serve ALIASES apelidos de campo na consulta SQL, pra quando tiver duas tabelas juncionadas
e aparecer dois campos com o mesmo nome voce usa apelido de campo para mostrar

Por exemplo: Campo ID na tabela Cliente e campo ID na tabela Produto

na consulta voce muda como SQL = SELECT … Produto.ID AS ID_PRODUTO, Cliente.ID AS ID_CLIENTE FROM … …

E pra mostrar vc coloca

produto.setProduto(rs.getString("[color=red]ID_PRODUTO[/color]"));
produto.setCliente(rs.getString("[color=red]ID_CLIENTE[/color]"));

Apenas exemplo pra vc entender…

;]

Entendi Charles. Excelente! obrigado