-1
データベースに挿入しようとしていますが、SQLException: Problem in your syntax, line 2
が表示されます。 私はそれを実行する前にクエリをコンソールに出力し、それをSQLシェルに貼り付けて問題なく動かしました。私は何が間違っているのか分からない、助けてください。Java SQLはsytaxが正しくないと言っていますが、シェルでクエリを実行すると動作します
Utilizador u = new Aluno("A55555","password","[email protected]","Cinco",false,new HashMap<>());
new UserDAO().put(u.getUserNum(),u);
SQLクエリを作成:
START TRANSACTION;
INSERT INTO `Utilizador` (id, nome,pass, Email)
VALUES ('A55555', 'Cinco', 'password', '[email protected]')
ON DUPLICATE KEY UPDATE id=VALUES(id),
pass=VALUES(pass),
nome=VALUES(nome),
Email=VALUES(Email);
INSERT INTO `Aluno` (Utilizador_id, eEspecial)
VALUES ('A55555',0)
ON DUPLICATE KEY UPDATE Utilizador_id=VALUES(Utilizador_id),
eEspecial=VALUES(eEspecial);
のJava:
String sql = "START TRANSACTION;\n" +
"INSERT INTO `Utilizador` (id, nome,pass, Email) \n" +
"VALUES (?, ?, ?, ?)\n" +
"ON DUPLICATE KEY UPDATE id=VALUES(id),\n" +
" pass=VALUES(pass),\n" +
" nome=VALUES(nome),\n" +
" Email=VALUES(Email);\n";
StringBuilder s = new StringBuilder(sql);
if (value instanceof Docente){
s.append("INSERT INTO `Docente` (Utilizador_id)\n" +
"VALUES (?)\n" +
"ON DUPLICATE KEY UPDATE Utilizador_id=VALUES(Utilizador_id);");
}else if (value instanceof Aluno){
s.append("INSERT INTO `Aluno` (Utilizador_id, eEspecial)\n" +
"VALUES (?,?)\n" +
"ON DUPLICATE KEY UPDATE Utilizador_id=VALUES(Utilizador_id), eEspecial=VALUES(eEspecial);");
}else if (value instanceof DiretorDeCurso){
s.append("INSERT INTO `DiretorDeCurso` (Utilizador_id)\n" +
"VALUES (?)" +
"ON DUPLICATE KEY UPDATE Utilizador_id=VALUES(Utilizador_id);\n");
}else{
return null;
}
System.out.println(s.toString());
PreparedStatement stm = connection.prepareStatement(s.toString());
stm.setString(1, value.getUserNum());
stm.setString(2, value.getName());
stm.setString(3, value.getPassword());
stm.setString(4, value.getEmail());
stm.setString(5, value.getUserNum());
if(value instanceof Aluno) stm.setBoolean(6,((Aluno) value).eEspecial());
System.out.println(stm.toString());
stm.executeUpdate();
例外の正確で完全なスタックトレースを送信します。 1つのステートメントで複数のクエリを実行していることに注意してください。それはMySQLによって受け入れられるかもしれませんが、一般的にそうではありません。 –
SQLに '\ n'を明示的に含めることも奇妙です。 – chrylis
トランザクションは、通常、SQL文を使用する代わりにAPIを使用して開始されます...しかし、これがあなたの特定の問題の原因である可能性があるならば、気にしないでください。 – treeno