20

TEST_SEQというシーケンスがあるとすると、次の値を選択する正しい方法は何でしょうか。これは動作しません:

select next value for TEST_SEQ

おそらく「FROM」句が必要なためです。HibernateでHSQLDialect.getSequenceNextValString()を見ると、次のようになります。

"select next value for " + sequenceName + " from dual_" + sequenceName

私の場合、次のような結果になります。

select next value for TEST_SEQ from dual_TEST_SEQ

これは2.0.0-rc8では機能しません(これは2.0より前のバージョンでのみ機能すると想定しています-検証されていません)DUALと呼ばれる1行の単純なテーブルを作成するソリューションに出くわしました。この場合、これは機能します(オラクルスタイル):

select next value for TEST_SEQ from DUAL

しかし、hsqldbにはこのテーブルが付属していないため、「最初の起動」時に休止状態にしてこのようなテーブルを生成する方法がわかりません。

シーケンスの次の値を箱から出して取得する方法が必要だと思っていて、それが欠落しているだけです。何か案は ?

4

3 に答える 3

29

TEST_SEQというシーケンスがあるとすると、次の値を選択する正しい方法は何でしょうか。

ドキュメントには次のように書かれていますが、

次の例のように、シーケンスの次の値をSELECT、INSERT、およびUPDATEステートメントに含めることができます。

SELECT [...,] NEXT VALUE FOR <sequencename> [, ...] FROM <tablename>;

「正しい」方法(HSQLDBにないダムDUALテーブルのようなテーブルを含まないため、より単純であるため)は次のようになります。

call NEXT VALUE FOR <sequence_name>;

これは1.7.2で登場し、これは実際にHSQLDialectはHibernateがHibernate Coreの「最近の」バージョンのシーケンスを処理する方法です(HHH-2839を参照)。

そして確かに、これは私がので見るものHSQLDialectですhibernate-core-3.3.0.SP1.jar

public String getSequenceNextValString(String sequenceName) {
    return "call next value for " + sequenceName;
}

したがって、私のアドバイスは次のとおりです。新しいバージョンのHibernateにアップグレードすると、HibernateCore3.2.5以前を使用している可能性が非常に高くなります。

于 2010-02-26T23:18:56.243 に答える
2

どうやらあなたが実行した場合

SET DATABASE SQL SYNTAX PGS TRUE(PGSはPostgresの略です)

次に、次のような標準のPostgres構文を使用してクエリを実行できます。select nextval('sequence_name')

まだ呼び出されていないcurval場合は、Postgresの動作と同様に、何も返されません。nextval

http://hsqldb.org/doc/guide/dbproperties-chapt.html

call NEXT VALUE FOR SEQUENCE_NAMEまた、これを一度実行すると、のような一般的なHSQLDBシーケンスが機能しなくなることにも注意してください。彼らはまだ働いているようです。

また、のようなより「エキゾチックな」Postgresのものselect last_value from schemaName.sequence_nameはまだエミュレートされていない/同じようには機能しないことに注意してください(セッションに関係なくシーケンスの現在の値を取得するため)。

このメッセージを避けてくださいCaused by: org.hsqldb.HsqlException: user lacks privilege or object not found: NEXTVAL

于 2014-07-23T20:51:58.190 に答える
0

たぶん、hibernateはそれらのdual_xxテーブルをその場で作成していますか?変。

とにかく、あなたの方法はhsqldb2.3.2で私のために働くようです:

 select next value for <sequence name>;

しかし、名前をエイリアスすることはできません。そのため、私はこれを行う必要がありました。

  select next value for <sequence name> as <my name>, 3

その後、エイリアスが機能し、デュアルは必要ありません。 call next valueエイリアスできなかったようです...

于 2020-10-20T18:39:33.187 に答える