Вставьте значение int Resultset в базу данных SQL - PullRequest
0 голосов
/ 16 мая 2018

Я работаю с 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

1 Ответ

0 голосов
/ 16 мая 2018

Нет смысла делать два обхода клиента / сервера в вашем случае, поэтому вместо этого используйте один оператор:

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-инъекцию и синтаксические ошибки, подобные той, что вы получаете. На данный момент, я действительно рекомендую вам прочитать эти темы!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...