Как получить следующий идентификатор в GRAILS? - PullRequest
3 голосов
/ 16 марта 2012

Мне нужно получить следующий доступный идентификатор в последовательности, используя GORM или собственный запрос. Как я могу это сделать?

Я использую оракула. ​​


UPDATE:

Мне нужно это значение ДО вставки, потому что моя строка будет использовать это значение. У меня есть таблица IMAGE со столбцом FILE_NAME, например:

- ID | FILE_NAME
- 123 | foo_bar_123.png
- 124 | xxx_yyy_124.png

Так много.

Ответы [ 2 ]

2 голосов
/ 16 марта 2012

Зачем вам нужно значение перед вставкой?Можете ли вы получить информацию как часть вставки, используя предложение RETURNING, то есть

INSERT INTO table_name( id, file_name )
  VALUES( some_sequence.nextval, <<bind variable>> )
  RETURNING id INTO <<bind variable>>

, или получить доступ к ней после вставки, используя

SELECT sequence_name.currval
  FROM dual

currval последовательностивозвращает самое последнее значение последовательности, созданной в текущем сеансе, так что это фактически потокобезопасно.Поскольку последовательности предназначены для предоставления чисел в среде с высокой степенью параллелизма, вы вообще не можете узнать, что будет nextval, если вы на самом деле не получите nextval.Даже если бы вы могли, нет никакой гарантии, что другой поток не придет и не получит значение, на которое вы посмотрели до того, как ваш INSERT имел место, поэтому было бы небезопасно заглянуть на nextval в многопользовательском режиме.окружающая среда.

1 голос
/ 16 марта 2012

Я адаптировал подсказки @Cave. Итак, мое решение:

Измените мое отображение с:

class Image {
...
id column: "ID", generator: "sequence", params: [sequence:"MY_SEQUENCE"]
...
}

до:

class Image {
...
id column: "ID", generator: "assigned"
...
}

И установите id вручную, используя это:

def getLastImageId(){
  def sql = "SELECT MY_SEQUENCE.nextval FROM dual"
  def query = sessionFactory.currentSession.createSQLQuery(sql);
  def result = query.list()
  return result[0]
}
...
newImage.id = getLastImageId()
newImage.fileName = "foo_bar_${newImage.id}.png"
...