我需要使用GORM或本机查询获取序列中的下一个可用ID。 我怎么能这样做?
我正在使用oracle。
更新
我需要此值 BEFORE 插入,因为我的行将使用此值。 我有一个名为IMAGE的表,其列为FILE_NAME,如下所示:
- ID | FILE_NAME
- 123 | foo_bar_123.png
- 124 | xxx_yyy_124.png
很多。
答案 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"