2012-03-15 3 views
3

GORMまたはネイティブクエリを使用して、次の利用可能なIDをシーケンスで取得する必要があります。 どうすればいいですか?GRAILSの次のIDを取得するには?

私はoracleを使用しています。


UPDATE:私の行は、この値を使用しますので、

私は、挿入する前にこの値を必要としています。

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

TKSたくさん: は、私はこのように、列FILE_NAMEとIMAGEと呼ばれるテーブルを、持っています。

+0

をdownvotedでしたか? – Topera

答えて

2

なぜ、挿入前に値が必要なのですか?あなたは

SELECT sequence_name.currval 
    FROM dual 

を使用してシーケンスのcurrvalは、シーケンスの最新の値を返す挿入した後、すなわち

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

またはアクセスも、RETURNING句を使用して、インサートの一部のような情報を得ることができます現在のセッションで生成されるため、実際にはスレッドセーフです。シーケンスは非常に並行した環境で数字を提供するように設計されているため、実際にnextvalを取得しない限り、nextvalの内容は一般的にわかりません。可能であれば、INSERTが発生する前に別のスレッドが来て、あなたが覗いた価値を得る保証はありませんので、マルチユーザ環境ではnextvalを覗いても安全ではありません。

+0

私はnextvalを試しました。 Grailsはnextvalも使用しているので、id + 1ではなくid + 2を得るのが怖いです。例:1,3,5,7 ...しかし、私は必要です:1,2,3,4 – Topera

+0

@Topera - 私私の答えを更新しました –

0

私は@Cave tipsを採用しました。 だから、私の解決策は次のとおりです。

変更私のマッピングから:

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" 
関連する問題