在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
将不再有效。
- 使用Spring 3,maven,JPA,c3p0在hibernate中“java.lang.NoSuchFieldError:NONE”
- Jersey:com.sun.jersey.spi.inject.Errors $ ErrorMessagesException
- 由于Bean Validation API而无法启动Hibernate Validator
- Discriminator,WrongClassException JPA和Hibernate后端
- Spring 4.1.0.RELEASE和Hibernate 4.3.6.Final的依赖性问题
- 无法解析org.springframework.transaction.annotation.Transactional的依赖项
- hibernate查询语言还是使用标准?
- 添加此ActionListener时出现错误
- Spring 3 MVC Hibernate 3.5.4 hibernateTemplate没有关闭连接(非事务性)