Как получить сгенерированный тип UUID, используя JDBC getGeneratedKeys?

0

Это относится к идентификатору типа MySQL и UUID для которого я использую функцию uuid() самого MySQL. Это дает мне не null resultSet, но next() значение всегда пустое.

Ниже приведен код:

String insertQuery = "INSERT INTO fixtures "
                        + "(id, whatever1, whatever2, whatever3, whatever4, "
                        ...
                        + "created_at) "
                        + "VALUES(UUID(), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

PreparedStatement preparedStatement = connection.prepareStatement(insertQuery, Statement.RETURN_GENERATED_KEYS);
.
.
.
preparedStatement.setDate(23, sqlDate);
preparedStatement.executeUpdate();
ResultSet keysResultSet = preparedStatement.getGeneratedKeys();
System.out.println(keysResultSet); // com.mysql.cj.jdbc.result.ResultSetImpl@6892b3b6
if(keysResultSet != null && keysResultSet.next()){
     System.out.println("Generated Emp Id: "+keysResultSet.getString("id"));
} else {
     System.out.println("No KEYS GENERATED");
}
  • 0
    Не уверен на 100% (именно поэтому я комментирую), но IIRC, MySQL Connector / J будет возвращать только значение автоинкремента, если оно есть. Поскольку вы не используете один, ничего не возвращается.
  • 0
    Кроме того, я не уверен, что имя совпадает с именем столбца, поэтому я бы взял первый столбец (или проверил метаданные набора результатов)
Показать ещё 7 комментариев
Теги:
jdbc
uuid

2 ответа

0

Для SQL Server 2008 и более поздних версий вы можете определить первичный ключ, используя автоматически сгенерированный UUID. Чтобы получить UUID, сгенерированный оператором INSERT, добавьте опцию OUTPUT после определения столбца и замените свой Statement.executeUpdate для Statement.executeQuery и извлеките значение из ResultSet. Вот фрагмент кода, показывающий, как это сделать:

            sqlStmt.append("INSERT INTO tableName");
            sqlStmt.append(" (column1");
            sqlStmt.append(", column2");
...
            sqlStmt.append(" OUTPUT inserted.columnUUID");
            sqlStmt.append(" VALUES (?, ?, ?, ?) ");
            statement = connection.prepareStatement(sqlStmt.toString());
            statement.clearParameters();
            int index = 0;
            ResultSet resultSet = statement.executeQuery();
            if (resultSet.next())
            {
                result = resultSet.getString(1);
                companyDB.varUUID = result;
            }
0

Нет ключа, генерируемого, но фактически предоставленного:

Поэтому либо оставите создание в базе данных:

String insertQuery = "INSERT INTO fixtures "
                        + "(whatever1, whatever2, whatever3, whatever4, "
                        ...
                        + "created_at) "
                        + "VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, "
                        + "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

Поскольку я не знаю, как легко достичь UUID на стороне MySQL, я бы предложил оригинальное решение с UUID на стороне java:

String insertQuery = "INSERT INTO fixtures "
                        + "(id, whatever1, whatever2, whatever3, whatever4, "
                        ...
                        + "created_at) "
                        + "VALUES(?, ?, ?, ?, ?, ?, ?, ?, "
                        + "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
 UUID id = UUID.randomUUID();
 preparedStatement.setString(1, id.toString());

Получение UUID становится неуместным.

  • 0
    Да уж. Это обходной путь, который я планировал использовать, если решение не найдено. Но я просто не хотел оставлять зависимость от языка моего приложения для генерации UUID, когда у меня уже есть функция, доступная в mysql.
  • 0
    И согласно вашему комментарию Ключ не сгенерирован, но фактически предоставлен - String yourSQL="insert into Table1(Id,Col2,Col3) values(SEQ.nextval,?,?)"; Кроме того, идентификатор предоставлен так же, как я делаю. Но это все еще возвращает resultSet.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню