executeQuery limitado

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:

   public static List<Palet> Verifica_Cerveja(String nome,int id, List<Palet> ListaPalet) {
	String sql = "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 ?;";
	Connection conn = Conexao.getConnection();
	try {
		PreparedStatement ps = conn.prepareStatement(sql);
		ps.setInt(1, id);
                    ps.setString(2, nome);
		ResultSet rs = ps.executeQuery(); //Dá erro nessa linha
		if(rs.next()) {
			ListaPalet.get(0).setNome(rs.getString("nome"));
		}else {
			return null;
		}
		Conexao.Fechar_Conexao(conn, ps);
		return ListaPalet;
	} catch (SQLException e) {
		e.printStackTrace();
	}
	JOptionPane.showMessageDialog(null, "Error", "", JOptionPane.ERROR_MESSAGE);
	return null;
}

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

Já consertei, porém o mesmo erro ainda continua.

E se vc tentar usar a query assim?

String sql = "SELECT c.nome FROM Palet p JOIN Cerveja c ON p.cerveja_id = c.id WHERE p.id like ? and c.nome like ?";

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.

Quando tu executa essa consulta num cliente do banco, funciona?

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?

1 curtida

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.

Vc consegue dizer qual o schema default no workbench, com isso, informar o schema na consulta é desnecessário.