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

2022-09-02 09:48:21

假设我有一个序列,称为TEST_SEQ选择其下一个值的正确方法是什么?这不起作用:

select next value for TEST_SEQ

可能是因为它需要一个“FROM”子句。看看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没有开箱即用地附带这个表,我不确定我如何在“第一次启动”时进入休眠状态来生成这样的表。

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


答案 1

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

虽然文档说:

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

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

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

call NEXT VALUE FOR <sequence_name>;

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

事实上,这就是我在以下中看到的:HSQLDialecthibernate-core-3.3.0.SP1.jar

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

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


答案 2

显然,如果你跑步

SET DATABASE SQL SYNTAX PGS TRUE(PGS代表Postgres)

然后你可以使用标准的Postgres语法查询它,比如select nextval('sequence_name')

它甚至不返回任何内容,如果尚未被调用,可能类似于Postgres的行为方式。curvalnextval

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

另请注意,如果您曾经这样做过,典型的HSQLDB序列(例如调用SEQUENCE_NAME的NEXT VALUE)将不再起作用。似乎它们仍然有效。

另请注意,更多“异国情调”的Postgres内容尚未被模拟/工作方式不同(用于获取序列的当前值,而不管会话如何)。select last_value from schemaName.sequence_name

避免此消息Caused by: org.hsqldb.HsqlException: user lacks privilege or object not found: NEXTVAL


推荐