как обрабатывать одинарные кавычки в подготовленном заявлении - PullRequest
0 голосов
/ 20 апреля 2020

Привет! Я хочу использовать подготовленное утверждение, подобное этому:

acl = conn.prepareStatement("INSERT INTO acls_t(user,topic,rw) values((SELECT id from users_t where username=?),'?/#',1);");
mqtt_acl.setString(1, name);
mqtt_acl.setString(2, uuid);

Моя база данных - mariadb, и она не принимает это. Он возвращает:

java.sql.SQLException: Could not set parameter at position 2 (values was '3aa4ea54-3105-47a3-9bfb-c17c4348d84a')
Query - conn:56(M)  - "INSERT INTO acls_t(user,topic,rw) values((SELECT id from users_t where username=?),'?/#',1);"

как я могу справиться с этим?

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Ваш оператор sql можно упростить до этого:

INSERT INTO acls_t(user,topic,rw) SELECT id, CONCAT(?, '/#'), 1 FROM users_t WHERE username = ?;

без использования VALUES, для которого вы должны вложить оператор SELECT. Поэтому измените ваш код на:

acl = conn.prepareStatement("INSERT INTO acls_t(user,topic,rw) SELECT id, CONCAT(?, '/#'), 1 FROM users_t WHERE username = ?;");
mqtt_acl.setString(1, uuid);
mqtt_acl.setString(2, name);

С этим кодом, если в таблице нет пользователя users_t с username, равным значению переменной name, тогда никакая строка не будет вставлена, но ваш код попытается вставить строку в таблицу acls_t и установить столбец user с помощью null.

1 голос
/ 20 апреля 2020

Сделайте это следующим образом:

acl = conn.prepareStatement("INSERT INTO acls_t(user,topic,rw) values((SELECT id from users_t where username=?),?,1);");
mqtt_acl.setString(1, name);
mqtt_acl.setString(2, uuid + "/#");
...