executeQuery limitado

13 respostas Resolvido
eclipsemysql
P

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

13 Respostas

S

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

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

L

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 ?";
P

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

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

P

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

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

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)
L
Solucao aceita

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

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

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

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

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

Criado 14 de agosto de 2020
Ultima resposta 17 de ago. de 2020
Respostas 13
Participantes 4