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