Подтвердить что ты не робот

"правильный" способ выбора следующего значения последовательности в 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 думает, что должен быть способ получить следующее значение для последовательности из коробки, а им просто не хватает. любые идеи?

4b9b3361

Ответ 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, больше не будет работать.