Я работаю с MySQL-сервером, и я пытаюсь выбрать идентификатор из другой таблицы и вставить этот идентификатор в таблицу, но он не работает все время.
Код:
public void submit() throws Exception {
Connection connection = getConnection();
Statement stmt = connection.createStatement();
Statement stmt1 = connection.createStatement();
ResultSet asset_id = stmt.executeQuery("SELECT id FROM cars.asset_type WHERE asset_type.name =" + "'" + sellables.getValue()+ "'");
while (asset_id.next()) {
System.out.println(asset_id.getInt("id"));
}
double value = parseDouble(purchased.getText());
System.out.println(value);
LocalDate localDate = purchased_at.getValue();
String insert = "INSERT INTO asset (type_id, purchase_price, purchased_at) VALUES ('"+ asset_id + "','" + value +"','" + localDate +"')";
stmt1.executeUpdate(insert);
}
Я получаю то же сообщение об ошибке.
Caused by: java.sql.SQLException: Incorrect integer value: 'com.mysql.cj.jdbc.result.ResultSetImpl@1779d92' for column 'type_id' at row 1
Нет никакой ценности при выполнении двух клиентских/серверных обращений в вашем случае, поэтому используйте только один оператор:
INSERT INTO asset (type_id, purchase_price, purchased_at)
SELECT id, ?, ?
FROM cars.asset_type
WHERE asset_type.name = ?
Если вы действительно хотите вставить только последний идентификатор из запроса SELECT
(как вы делали повторение результата SELECT
и выбрасывали все остальные идентификаторы), вместо этого используйте этот запрос:
INSERT INTO asset (type_id, purchase_price, purchased_at)
SELECT id, ?, ?
FROM cars.asset_type
WHERE asset_type.name = ?
ORDER BY id DESC -- I guess? Specify your preferred ordering here
LIMIT 1
Или с кодом JDBC вокруг него:
try (PreparedStatement s = connection.prepareStatement(
"INSERT INTO asset (type_id, purchase_price, purchased_at) " +
"SELECT id, ?, ? " +
"FROM cars.asset_type " +
"WHERE asset_type.name = ?")) {
s.setDouble(1, parseDouble(purchased.getText()));
s.setDate(2, Date.valueOf(purchased_at.getValue()));
s.setString(3, sellables.getValue());
}
Это использование PreparedStatement
, которое предотвратит SQL-инъекции и синтаксические ошибки, как тот, который вы получаете. На этом этапе я действительно рекомендую вам прочитать об этих темах!
asset_id
- этоResultSet
а неint
? Вы читаете (и выбрасывание) РАСЧ в вашем вwhile
цикла, а затем вы пытаетесь поставитьResultSet
объект в вашу вставке заявление. Кроме того, прекратите использоватьStatement
прямо сейчас и перейдите кPreparedStatement
и его методамsetXXX
(вы найдете множество примеров с небольшим поиском).