"правильный" способ выбора следующего значения последовательности в HSQLDB 2.0.0-rc8
предположим, что у меня есть последовательность, называемая 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 - проверено неверно)
Я столкнулся с решением, которое включает создание простой таблицы с 1 строкой, называемой DUAL, и в этом случае это будет работать (стиль оракула):
select next value for TEST_SEQ from DUAL
но hsqldb не приходит с этой таблицей из коробки, и я не уверен, как я могу получить спящий режим для создания такой таблицы при первой загрузке.
Im думает, что должен быть способ получить следующее значение для последовательности из коробки, а им просто не хватает.
любые идеи?
Ответы
Ответ 1
Предположим, что у меня есть последовательность, называемая TEST_SEQ, каков будет правильный способ выбора ее следующего значения?
Пока документация говорит:
Следующее значение для последовательности может быть включено в операторы SELECT, INSERT и UPDATE, как в следующем примере:
SELECT [...,] NEXT VALUE FOR <sequencename> [, ...] FROM <tablename>;
"правильный" способ (потому что проще, потому что не включает таблицу, такую как туповатая таблица DUAL, которая не имеет HSQLDB):
call NEXT VALUE FOR [sequence_name];
Это появилось в 1.7.2, и это на самом деле то, как Hibernate обрабатывает последовательности в HSQLDialect
"последних" версий Hibernate Core ( см. HHH-2839).
И действительно, это то, что я вижу в HSQLDialect
of hibernate-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
(PGS для Postgres)
тогда вы можете запросить его с помощью стандартного синтаксиса Postgres, например select nextval('sequence_name')
http://hsqldb.org/doc/guide/dbproperties-chapt.html
Также обратите внимание, что если вы это сделаете, типичная последовательность HSQLDB, например call NEXT VALUE FOR SEQUENCE_NAME
, больше не будет работать.