2016-09-02 4 views
0

У меня есть веб-служба и база данных (MySQL), я создал таблицу под названием batch, которая должна генерировать каждый раз, когда я добавляю некоторое значение, уникальный ключ.Java Spring JDBC last_insert_id()

CREATE TABLE batch (
    id INT AUTO_INCREMENT PRIMARY KEY, 
    description VARCHAR(250) NOT NULL 
); 

Это код для таблицы базы данных и здесь вы, что я написал до сих пор:

static final String addBatchIdSql = "INSERT INTO batch" + "(description)" + "VALUES (?)"; 
static final String getBatchIdSql = "SELECT LAST_INSERT_ID()"; 

    @Override 
     public int getBatchId() { 
      DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
      String batchIDcreation = dateFormat.format(new Date()); 
      jdbcTemplate.update(addBatchIdSql, batchIDcreation); 
      SqlRowSet rowSet = jdbcTemplate.queryForRowSet(getBatchIdSql); 
      while (rowSet.next()) { 
       System.out.println(rowSet.findColumn("id")); 
      } 
      return 0; 
     } 

Проблема в том, что каждый раз, когда я пытаюсь получить идентификатор он бросает исключение, которое заявляет «недопустимое имя столбца», я проверил свойства именования в своем приложении в целом и не смог найти какую-либо проблему, что здесь может быть неправильным: //

+1

Вы найдете [этот SO post] (http://stackoverflow.com/questions/14170656/get-last-inserted-auto-increment-id-in-mysql) очень поучительным. –

+1

Полезная ссылка на MySQL 'LAST_INSERT_ID': http://dba.stackexchange.com/questions/21181/is-mysqls-last-insert-id-function-guaranteed-to-be-correct –

ответ

2

Вы можете попробовать наложить псевдоним столбца, который возвращается из вызова вашего приложения в LAST_INSERT_ID():

static final String getBatchIdSql = "SELECT LAST_INSERT_ID() AS id"; 

Полный код:

static final String addBatchIdSql = "INSERT INTO batch" + "(description)" + "VALUES (?)"; 
static final String getBatchIdSql = "SELECT LAST_INSERT_ID() AS id"; 

@Override 
public int getBatchId() { 
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    String batchIDcreation = dateFormat.format(new Date()); 
    jdbcTemplate.update(addBatchIdSql, batchIDcreation); 
    SqlRowSet rowSet = jdbcTemplate.queryForRowSet(getBatchIdSql); 
    if (rowSet.next()) { 
     System.out.println(rowSet.findColumn("id")); 
    } 
    return 0; 
} 
+0

Большое вам спасибо, это сработало по крайней мере, я получаю идентификатор, но этот метод запущен на планировщике, проблема, с которой я сталкиваюсь, заключается в том, что она дает мне 1 в каждом вызове этого метода, можете ли вы дать мне некоторое предложение :) – imoteb

+0

Как именно вы используете последний вставленный идентификатор? В верхней части моей головы ваши варианты будут либо для голосования, то есть использовать значение, которое вы получаете на определенной частоте, или занять некоторое время со временем. –

+0

Я использую его для получения определенной частоты, каждый раз, когда я запускаю этот метод, мне нужно получить последний id:/ – imoteb

2

Попробуйте это потому, что ваш идентификатор в качестве автоматического приращения, поэтому последняя вставка идентификатор ваш максимальный идентификатор

static final String getBatchIdSql = "SELECT MAX(id) AS id FROM batch"; 

Всего код:

static final String addBatchIdSql = "INSERT INTO batch" + "(description)" + "VALUES (?)"; 
static final String getBatchIdSql = "SELECT MAX(id) AS id FROM batch"; 

       @Override 
       public int getBatchId() { 
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
        String batchIDcreation = dateFormat.format(new Date()); 
        jdbcTemplate.update(addBatchIdSql, batchIDcreation); 
        SqlRowSet rowSet = jdbcTemplate.queryForRowSet(getBatchIdSql); 
        if (rowSet.next()) { 
         System.out.println(rowSet.findColumn("id")); 
        } 
        return 0; 


} 
+1

Это не обязательно работает правильно, например, считать read_committed и параллельные вставки (+ фиксирует) другими транзакциями. –