在HSQLDB 2.0.0-rc8中选择下一个序列值的“正确”方法

时间:2010-02-26 07:18:23

标签: java sql hibernate orm hsqldb

假设我有一个名为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行简单表,在这种情况下,这将起作用(oracle风格):

select next value for TEST_SEQ from DUAL

但是hsqldb没有开箱即用这个表,我不知道如何在“首次启动”时生成这样的表来进行休眠。

我认为必须有一种方法来获得开箱即用的序列的下一个值,我只是错过它。 任何想法?

3 个答案:

答案 0 :(得分:25)

  

假设我有一个名为TEST_SEQ的序列,那么选择下一个值的正确方法是什么?

虽然documentation说:

  

序列的下一个值可以包含在SELECT,INSERT和UPDATE语句中,如下例所示:

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

“正确”的方式(因为更简单,因为不涉及HSQLDB没有的哑表DUAL表这样的表)将是:

call NEXT VALUE FOR [sequence_name];

这出现在1.7.2中,这实际上是Hibernate如何处理Hibernate Core的HSQLDialect“最近”版本中的序列(参见 HHH-2839 )。

事实上,这就是我在HSQLDialect hibernate-core-3.3.0.SP1.jar中看到的内容:

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

所以我的建议是:升级到更新版本的Hibernate,你很可能使用Hibernate Core 3.2.5或更早版本。

答案 1 :(得分:2)

显然,如果你跑

SET DATABASE SQL SYNTAX PGS(PGS代表Postgres)

然后您可以使用标准Postgres语法查询它,例如select nextval('sequence_name') http://hsqldb.org/doc/guide/dbproperties-chapt.html

另请注意,如果您曾经这样做过,典型的HSQLDB序列(如call NEXT VALUE FOR SEQUENCE_NAME)将不再有效。

答案 2 :(得分:0)

也许冬眠正在动态创建那些dual_xx表?很奇怪。

无论如何,对于hsqldb 2.3.2,您的方式似乎对我有用:

 select next value for <sequence name>;

但是您不能为该名称起别名,因为我必须这样做:

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

然后别名起作用,不需要双重名称。 call next value我似乎没有别名...