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

假设我有一个名为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之前的版本 – 尚未validation)我遇到了一个解决方案,涉及创建一个简单的表,其中包含一行称为DUAL,在这种情况下,这将起作用(甲骨文风格):

 select next value for TEST_SEQ from DUAL 

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

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

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

虽然文档说:

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

 SELECT [...,] NEXT VALUE FOR  [, ...] FROM ; 

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

 call NEXT VALUE FOR [sequence_name]; 

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

事实上,这就是我在hibernate-core-3.3.0.SP1.jar

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

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

显然,如果你跑

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将不再有效。