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:
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
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.
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
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?
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á:
public static List<Vendas> Vendas(int id, List<Vendas> ListaVendas) {
String sql = "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 = ?;";
Connection conn = Conexao.getConnection();
try {
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, id);
ResultSet rs = ps.executeQuery(); // Dá erro nessa linha, a String sql não é lida por completo
if (rs.next()) {
ListaVendas.add(new Vendas(rs.getString(""), rs.getInt(""), rs.getString("")));
} else {
return null;
}
Conexao.Fechar_Conexao(conn, ps);
return ListaVendas;
} catch (SQLException e) {
e.printStackTrace();
}
JOptionPane.showMessageDialog(null, "Error", "", JOptionPane.ERROR_MESSAGE);
return null;
}
e o erro é:
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 C.nome, V.quantidade, V.data_venda FROM Cerveja C JOIN Vendas V ON V.id =’ at line 2
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:403)
at com.mysql.jdbc.Util.getInstance(Util.java:386)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:944)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3933)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3869)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2524)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2675)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2465)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1915)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2023)
at classes_secundárias.Teste_funcs.Vendas(Teste_funcs.java:199)
at interfaces.Estoque_Visualization.Vendas_Escolha.carregarPallets(Vendas_Escolha.java:158)
at interfaces.Estoque_Visualization.Vendas_Escolha.(Vendas_Escolha.java:108)
at interfaces.Estoque_Visualization.Vendas_Escolha.main(Vendas_Escolha.java:57)
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.
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
Dá o mesmo erro, porém ele lê menos:
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 C.nome, V.quantidade, V.data_venda FROM Cerveja C INNER JOIN Vendas V ON ’ at line 2
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:403)
at com.mysql.jdbc.Util.getInstance(Util.java:386)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:944)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3933)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3869)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2524)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2675)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2465)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1915)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2023)
at classes_secundárias.Teste_funcs.Vendas(Teste_funcs.java:199)
at interfaces.Estoque_Visualization.Vendas_Escolha.carregarPallets(Vendas_Escolha.java:158)
at interfaces.Estoque_Visualization.Vendas_Escolha.(Vendas_Escolha.java:108)
at interfaces.Estoque_Visualization.Vendas_Escolha.main(Vendas_Escolha.java:57)
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).
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.