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

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版本之前的版本中可行 - 尚未验证)。 我找到了一个解决方案,它涉及创建一张只有1行的简单表格,名称为DUAL,这种情况下就可以使用(类似于Oracle):

select next value for TEST_SEQ from DUAL

但是hsqldb默认情况下没有这个表,而且我不确定如何让hibernate在“第一次启动”时生成这样的表。

我认为肯定有一种方法可以从箱子中获取序列的下一个值,我只是错过了它。 有什么想法吗?

3个回答

29

假设我有一个序列,称为TEST_SEQ,选择其下一个值的正确方式是什么?

虽然文档中写道:

序列的下一个值可以像以下示例中一样包含在SELECT、INSERT和UPDATE语句中:

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

“正确”的方法(因为更简单,不像一个愚蠢的 DUAL 表那样涉及到表格,而 HSQLDB 没有这个表)是:

call NEXT VALUE FOR <sequence_name>;

这个问题出现在1.7.2版本中,实际上这就是Hibernate在“最近”版本的Hibernate Core中处理序列的方式(请参见HHH-2839)。

的确,在hibernate-core-3.3.0.SP1.jarHSQLDialect中,我看到的就是这个。

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

因此,我的建议是:升级到更新的Hibernate版本,您很可能正在使用Hibernate Core 3.2.5或更早的版本。


@hatchetman82 不用谢。顺便说一下:认可一个好答案的常见方式是给它点赞 ;) - Pascal Thivent
1
@hatchetman82 没问题。只是如果你认为一个答案是好答案(如果你接受它,这很可能),那么在我看来,点赞是有意义的,这就是 SO 的工作方式。 - Pascal Thivent
嗨,这可能与此有关。我正在使用Apache的DdlUtils使用此xml在启动时生成数据库以获取id:<column name="id" type="INTEGER" required="true" primaryKey="true" />。插入对象时应该做什么才能获得新的键值?我还在使用iBatis。 - James P.

2
显然,如果你运行 SET DATABASE SQL SYNTAX PGS TRUE(PGS代表Postgres)
那么你可以使用标准的Postgres语法来查询它,例如select nextval('sequence_name') 甚至对于curval,如果尚未调用nextval,它也会返回空值,可能类似于Postgres的行为。 http://hsqldb.org/doc/guide/dbproperties-chapt.html 还要注意一点,如果你这样做了,典型的HSQLDB序列如call NEXT VALUE FOR SEQUENCE_NAME将不再起作用。看起来它们仍然有效。
此外,请注意更“奇特”的Postgres内容,例如select last_value from schemaName.sequence_name尚未被仿真/无法在获取序列当前值时(不考虑会话)发挥相同的作用。
避免出现以下错误信息:Caused by: org.hsqldb.HsqlException: user lacks privilege or object not found: NEXTVAL

0

也许Hibernate是动态创建这些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 我似乎无法使用别名...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接