Erro de sintaxe Mysql JDBC

Prezados, bom dia.

Quando rodo o código abaixo, ele está inserindo aspas antes do nome da tabela, e com isso gera erro de sintaxe no mysql.
Alguem pode me ajudar a entender o por quê disso?

conn = ConexaoBanco.abrirConexao();
	conn.setAutoCommit(false);
	String sql = "UPDATE PEDIDO_COMPRA SET ? = (?) WHERE ID_PEDIDO_COMPRA = "
			+ pedidoCompra.getIdPedCompra();
	pst = conn.prepareStatement(sql);
	if (!pedidoCompra.getDataColetaTransportadora().equals(LocalDate.of(1970, 1, 1))) {
			pst.setString(1, "DT_COLETA");
			pst.setDate(2, ConverteUtil.convertLocalToDate(pedidoCompra.getDataColetaTransportadora()));
			pst.addBatch();
	}
	if (!pedidoCompra.getDataPrevisaoEntrega().equals(LocalDate.of(1970, 1, 1))) {
			pst.setString(1, "DT_PREVISAO_ENTREGA");
			pst.setDate(2, ConverteUtil.convertLocalToDate(pedidoCompra.getDataPrevisaoEntrega()));
			pst.addBatch();
	}
	if (!pedidoCompra.getDataRealEntrega().equals(LocalDate.of(1970, 1, 1))) {
			pst.setString(1, "DT_ENTREGA");
			pst.setDate(2, ConverteUtil.convertLocalToDate(pedidoCompra.getDataRealEntrega()));
			pst.addBatch();
	}
	if (!pedidoCompra.getPrazoFinal().equals(LocalDate.of(1970, 1, 1))) {
			pst.setString(1, "PRAZO_FINAL");
			pst.setDate(2, ConverteUtil.convertLocalToDate(pedidoCompra.getPrazoFinal()));
			pst.addBatch();
	}

	pst.executeBatch();
	conn.commit();

	JOptionPane.showMessageDialog(null, "Atualizado com sucesso!");

Alguém?

@fabiio2 isso não será possível!
O PreparedStatement serve para atribuir VALORES aos parâmetros e esse não é o caso. O erro está ocorrendo justamente pq está sendo passado um String e não uma coluna do modelo.
Repense na forma como vocês está criando esse update.
Sugiro que você trabalhe com String#replace() nesse caso.

Boa sorte!

2 curtidas

Mas Diogo, eu não posso atribuir o nome de uma coluna, é isso?
Como faço para percorrer as colunas caso sejam vários updates? Usando int?

Evite misturar responsabilidades. Se o update for ocorrer em momentos diferentes atualizando somente um campo, então faça um update pra atender cada funcionalidade. Mas se quer fazer essa gambiarra de sql genérico, vai ter que concatenar na string sql o campo, ou fazer como no hibernate, um ineficiente update com todos os campos, fazendo tratamentos pra ler o que está no banco antes e mudar o que você precisa.

O problema é que eu não quero que se algum campo seja inválido, o outro faça o update na base antes com condição válida.
Tenho uma janela com alguns campos de data. Nenhum deles são obrigatórios. Nessa janela de edição, o usuário vai inserindo informações de acompanhamento. Desde o envio do pedido até a chegada. Segue imagem:

Só os campos de data podem ser preenchidos, e quando já tem informação na base sobre eles, ficam inabilitados.

Como posso fazer um update integro (garantindo todos os updates) sem o executeBatch?

Tem possibilidade de fazer um UPDATE com valor null ou vazio num campo DATE no MySQL?

Se esses dados vão ser atualizados nesta funcionalidade, então faz um update diretamente com os campos necessários. Exemplo para ilustrar:

UPDATE
  PEDIDO_COMPRA
SET
  DT_PREVISAO_ENTREGA = ?,
  PRAZO_FINAL = ?,
  DT_ENTREGA = ?
WHERE
  ID_PEDIDO_COMPRA =  ?

Obs.:

Não concatene valores direto na string do sql, como você fez no id_pedido_compra. Leia sobre SQL injection.

Antes de fazer o update, faça a validação desses dados.

Neste caso use diretamente executeUpdate ao invés de addBatch/executeBatch.

Sobre null, tem possibilidade sim, se for permitido deixar o usuário gravar uma data em branco, tem que setar o parâmetro como null. Dá uma pesquisa sobre, exemplo: http://stackoverflow.com/questions/14507278/cant-insert-an-empty-date-value-into-mysql

1 curtida

@javaflex

Mas fazendo o update separadamente, caso um seja inválido, eu consigo fazer um rollback nos atualizados?

Por você estar usando transação, sim.