Estou fazendo uma Função para verificar o nome de uma cerveja que é passado como parâmetro um id, nome e um tipo List<>, o problema é que quando chega no executeQuery ele só lê a String sql até certa parte e não toda, segue e código e o erro:
publicstaticList<Palet>Verifica_Cerveja(Stringnome,intid,List<Palet>ListaPalet){Stringsql="USE DB_Estoque; \r\n"+"SELECT Cerveja.nome FROM Palet JOIN Cerveja ON Palet.cerveja_id = Cerveja.id\r\n"+"WHERE Palet.id like ? and Cerveja.nome like ?;";Connectionconn=Conexao.getConnection();try{PreparedStatementps=conn.prepareStatement(sql);ps.setInt(1,id);ps.setString(2,nome);ResultSetrs=ps.executeQuery();//Dá erro nessa linhaif(rs.next()){ListaPalet.get(0).setNome(rs.getString("nome"));}else{returnnull;}Conexao.Fechar_Conexao(conn,ps);returnListaPalet;}catch(SQLExceptione){e.printStackTrace();}JOptionPane.showMessageDialog(null,"Error","",JOptionPane.ERROR_MESSAGE);returnnull;}
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘SELECT Cerveja.nome FROM Palet JOIN Cerveja ON Palet.cerveja_id = Cerveja.id WHE’ at line 1
“WHERE Palet.id like ?” o ID do pallet é o primeiro parâmetro do PreparedStatement
“and Cerveja.nome like ?” o NOME da cerveja é o segundo parâmetro do PreparedStatement
Olha quem você setou como primeiro e segundo:
ps.setString(1,nome);ps.setInt(2,id);
P
Pedrocoelho1035
Já consertei, porém o mesmo erro ainda continua.
L
Lucas_Camara
E se vc tentar usar a query assim?
Stringsql="SELECT c.nome FROM Palet p JOIN Cerveja c ON p.cerveja_id = c.id WHERE p.id like ? and c.nome like ?";
P
Pedrocoelho1035
Ainda não foi, o erro permanece o mesmo porém ele leu mais do que antes, a Query se comporta como se tivesse um limite de tamanho, embora eu acredite que não deve existir, ao menos não para um texto tão pequeno.
L
Lucas_Camara
Quando tu executa essa consulta num cliente do banco, funciona?
P
Pedrocoelho1035
Sim no workbench funciona tudo certo, e também tenho uma duzia de funções como essa que utilizo em outros lugares e todas funcionam, só essa que não está, a unica diferença é o tamanho da string sql
L
lvbarbosa1 like
O erro não vai mostrar a query inteira, só vai mostrar perto de onde deu o problema pra te ajudar a debugar. Não é um problema de limite, tem algo errado na sua query.
Como ficou a query final depois que vc fez o que o Lucas falou, e oq o erro mostrou?
P
Pedrocoelho1035
essa ai em especifica eu acabei adaptando para poder adiantar e não ficar preso a isso, porém tem outra função que estou fazendo que ainda não tentei adaptar e nem sei se tem como, que estou caindo nesse mesmo problema de cima, vou mandar ela e o erro que dá:
publicstaticList<Vendas>Vendas(intid,List<Vendas>ListaVendas){Stringsql="USE DB_Estoque; \r\n"+"SELECT C.nome, V.quantidade, V.data_venda FROM Cerveja C JOIN Vendas V ON V.id = C.id "+"WHERE V.id = ?;";Connectionconn=Conexao.getConnection();try{PreparedStatementps=conn.prepareStatement(sql);ps.setInt(1,id);ResultSetrs=ps.executeQuery();// Dá erro nessa linha, a String sql não é lida por completoif(rs.next()){ListaVendas.add(newVendas(rs.getString(""),rs.getInt(""),rs.getString("")));}else{returnnull;}Conexao.Fechar_Conexao(conn,ps);returnListaVendas;}catch(SQLExceptione){e.printStackTrace();}JOptionPane.showMessageDialog(null,"Error","",JOptionPane.ERROR_MESSAGE);returnnull;}
Em vez de usar apenas a palavra JOIN, faz o teste com INNER JOIN. E pq vc coloca isso USE DB_Estoque; nas suas consultas? Isso é desnecessário. Não é uma boa ficar usando esses ; também na consulta.
P
Pedrocoelho1035
Eu tentei incluir ele no comando de baixo porém acaba gastanto mais espaço e se fizer sem ele dá erro pois o sql não reconhece o banco, ele diz que tem que especificar qual banco vou utilizar
Em vez de colocar USE DB_Estoque;, e se vc testar assim: DB_Estoque.Cerveja. Vc referencia a tabela cerveja já dizendo à qual schema ela pertence. Geralmente é assim que eh feito (pelo menos nos lugares em que já trabalhei).
P
Pedrocoelho1035
agora parece estar funcionando, tirei o Use, o que achei estranho foram duas coisas, a primeira é que quando estava implementando esse comando (no workbench) que utilizo o Join, antes ele dava erro dizendo que era necessário dizer qual era o banco de dados, agora sem usar o DB_Estoque nem no use, nem no comando, somente com as tabelas ele está reconhecendo. E o segundo é que realmente o problema não era limitação do executeQuery e sim do comando Use, não imaginava que fosse isso pois no workbench funcionanva normalmente.
L
Lucas_Camara
Vc consegue dizer qual o schema default no workbench, com isso, informar o schema na consulta é desnecessário.