2015-07-07 2 views
3

пытаюсь использовать следующий код, чтобы получить автоматически сгенерированный идентификатор. Мой конец - это MySQL. Код выглядит так:Вставить возвращаемый запрос для MySQL в JOOQ

Record record = create.insertInto(CANDIDATE, CANDIDATE.FIRST_NAME,  
     CANDIDATE.LAST_NAME,CANDIDATE.EXTRACTED_NAME) 
     .values("Charlotte", "Roche","Charlotte Roche") 
     .returning(CANDIDATE.ID) 
     .fetchOne(); 

System.out.println(record.getValue(CANDIDATE.ID)); 

Я получаю исключение NullPointerException. Я взглянул на http://www.jooq.org/javadoc/latest/org/jooq/InsertReturningStep.html. Это говорит

Derby, H2, Ingres, MySQL, SQL Server позволяет только для получения IDENTITY значения столбца как "сгенерированный ключ". Если запрашиваются другие поля, выдается второе заявление. Клиентский код должен обеспечивать целостность транзакций между двумя операторами.

Согласно моему пониманию в Mysql auto_increment работает как IDENTITY. Может кто-нибудь, пожалуйста, пролить некоторый свет на то, как достичь этого для MySQL

я взял посмотреть на эту SO Question on a similar topic и попытался следующие

Result<?> record = 
      create.insertInto(CANDIDATE, CANDIDATE.FIRST_NAME, CANDIDATE.LAST_NAME,CANDIDATE.EXTRACTED_NAME) 
        .values("Charlotte", "Roche","Charlotte Roche") 
        .returning(CANDIDATE.ID) 
        .fetch(); 

      System.out.println(record.size()); 

Хотя вставляет запись в интерфейсе, но он печатает record.size() как ноль

+0

Не могли бы вы опубликовать 'NullPointerException', который вы получали? Не могли бы вы также разместить DDL своей таблицы «CANDIDATE»? –

+0

Для записи эта проблема также сообщается как [# 4400] (https://github.com/jOOQ/jOOQ/issues/4400) –

ответ

0

Возможно, возникла проблема с транзакцией. Вставка, возможно, еще не сохранила эти значения в базе данных, поэтому ничего не извлекается.

Кроме того, я думаю, что IDENTITY в случае MySQL не сделан AUTO_INCREMENT, но PRIMARY KEY (...) https://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html

0

Просто сделал тест вставки записи и извлечения сгенерированный идентификатор внутри службы Spring без любая проблема.

Так что да, auto_increment в MySQL работает как IDENTITY с jOOQ.

В таблице MySQL выглядит следующим образом:

CREATE TABLE persons (
    `id` mediumint(9) NOT NULL AUTO_INCREMENT, 
    `first_name` varchar(64) NOT NULL, 
    `last_name` varchar(64) NOT NULL, 
    primary key(id) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

и службы, как это:

public Result<PersonsRecord> insertPerson(String firstName, String lastName) { 
    Result<PersonsRecord> result = 
     dsl 
      .insertInto(
        PERSONS, 
        PERSONS.FIRST_NAME, 
        PERSONS.LAST_NAME) 
      .values(
        firstName, 
        lastName) 
      .returning(PERSONS.ID) 
      .fetch(); 
    logger.debug("Person ID: " + result.getValue(0, PERSONS.ID)); 
    return result; 
} 

Сформированный идентификатор доступен сразу после выполнения вставки:

Person ID: 4 
2

Я знаю, что опаздываю на вечеринку. Но я надеюсь, что смогу помочь кому-то с подобной проблемой,

Derby, H2, Ingres, MySQL, SQL Server позволяет только для получения значений столбцов IDENTITY в качестве "сгенерированный ключ". Если запрашиваются другие поля, выдается второе заявление. Клиентский код должен обеспечивать целостность транзакций между двумя операторами.

Это проблема "generated key". Вы можете проверить, равен ли ваш идентификатор таблицы AUTO_INCREMENT или нет, используя SHOW CREATE TABLE $table_name. Я думаю, что это не так.

P/s: Я использую MySQL

Смежные вопросы