如何在GRAILS中获得下一个ID?

时间:2012-03-15 22:20:03

标签: oracle grails plsql gorm

我需要使用GORM或本机查询获取序列中的下一个可用ID。 我怎么能这样做?

我正在使用oracle。


更新

我需要此值 BEFORE 插入,因为我的行将使用此值。 我有一个名为IMAGE的表,其列为FILE_NAME,如下所示:

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

很多。

2 个答案:

答案 0 :(得分: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是不安全的。多用户环境。

答案 1 :(得分:1)

我改编了@Cave提示。 所以,我的解决方案是:

从以下位置更改我的映射:

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

为:

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

使用此设置id 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"