20

假设我有一个序列,称为 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 行的简单表,在这种情况下这将起作用(甲骨文风格):

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中,这实际上是 Hibernate 在HSQLDialect“最新”版本的 Hibernate Core 中处理序列的方式(参见HHH-2839)。

事实上,这就是我在 of 中看到HSQLDialecthibernate-core-3.3.0.SP1.jar

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

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

于 2010-02-26T23:18:56.243 回答
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将不再起作用。似乎他们仍然工作。

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

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

于 2014-07-23T20:51:58.190 回答
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我好像不能化名...

于 2020-10-20T18:39:33.187 回答