[RESOLVIDO] Recuperar dados após consulta com JOINS

5 respostas
K
Galera, eu consigo dar um SELECT no banco, usando JOIN desta maneira:
public List<Produto> 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<Produto> produtos = new ArrayList<Produto>();

            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);
        }
Mas quando eu não uso o JOIN eu do um SELECT assim:
public List<Produto> 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);
        }
    }
A pergunta é: Porque quando eu dou um select desta maneira abaixo, usando o JOIN ele da erro na hora de recuperar os dados?
public List<Produto> 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<Produto> produtos = new ArrayList<Produto>();

			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);
		}
	}
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")

5 Respostas

fabiocortolan

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.

K

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

fabiocortolan

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

charleston10

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…

;]

K

Entendi Charles. Excelente! obrigado

Criado 23 de abril de 2013
Ultima resposta 23 de abr. de 2013
Respostas 5
Participantes 3