2012-03-15 2 views
3

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

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


UPDATE:

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

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

Tks много.

+0

Почему я downvoted? – Topera

ответ

2

Зачем вам нужно значение перед вставкой? Не могли бы вы получить информацию как часть вставки, используя пункт 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 в многопользовательскую среду.

+0

Я пробовал nextval. Grails также использует nextval, поэтому я боюсь получить всегда id + 2, а не id + 1. Пример: 1, 3, 5, 7 ... но я хочу: 1, 2, 3, 4 – Topera

+0

@Topera - I обновил мой ответ –

0

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

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

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

к:

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

и установить идентификатор mannualy с помощью этого:

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" 
Смежные вопросы