«правильный» способ выбора следующего значения последовательности в HSQLDB 2.0.0-rc8 - PullRequest
20 голосов
/ 26 февраля 2010

предположим, у меня есть последовательность, называемая TEST_SEQ какой будет правильный способ выбора его следующего значения? это не работает:

select next value for TEST_SEQ

вероятно, потому что он ожидает предложение "ОТ". глядя на 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 не поставляется с этой таблицей из коробки, и я не уверен, как я могу получить hibernate для генерации такой таблицы при "первой загрузке".

Я думаю, что должен быть способ получить следующее значение для последовательности из коробки, и я просто пропускаю его. есть идеи?

Ответы [ 2 ]

27 голосов
/ 27 февраля 2010

Предположим, у меня есть последовательность, называемая 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 из 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 голосов
/ 24 июля 2014

Видимо, если вы запустите

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

...