2010-02-26 12 views
18

Angenommen, ich habe eine Sequenz, genannt TEST_SEQ Was wäre die richtige Wahl des nächsten Wertes? dies nicht funktioniert:"Korrekte" Art, nächsten Sequenzwert in HSQLDB 2.0.0-rc8 zu wählen

select next value for TEST_SEQ

wahrscheinlich, weil es eine "FROM-Klausel" erwartet. bei HSQLDialect.getSequenceNextValString suchen() in Hibernate Ich sehe dies:

"select next value for " + sequenceName + " from dual_" + sequenceName

was in meinem Fall in so etwas wie führen würde:

select next value for TEST_SEQ from dual_TEST_SEQ

, die für 2.0.0-rc8 (i funktioniert nicht nur annehmen, dass dies funktioniert in pre-2.0-Versionen - havent überprüft) ich habe über eine Lösung kommen, die aufgerufen DUAL eine einfache Tabelle mit 1 Zeile beinhaltet die Erstellung, wobei dieser (oracle Stil funktioniert):

select next value for TEST_SEQ from DUAL

aber hsqldb kommt nicht mit dieser Tabelle aus der Box, und ich bin nicht sicher, wie ich Hibernate erhalten kann, um eine solche Tabelle bei "ersten Start" zu generieren.

Ich denke, es muss einen Weg geben, um den nächsten Wert für eine Sequenz aus der Box zu bekommen und ich vermisse es einfach. irgendwelche Ideen?

Antwort

23

Angenommen, ich habe eine Sequenz namens TEST_SEQ, welche wäre die richtige Wahl des nächsten Wertes?

Während die documentation sagt:

Der nächste Wert für eine Sequenz können in SELECT, INSERT und UPDATE enthalten Anweisungen, wie im folgenden Beispiel:

SELECT [...,] NEXT VALUE FOR <sequencename> [, ...] FROM <tablename>; 

die " Korrekterweise (weil einfacher, weil keine Tabelle wie eine dumme DUAL-Tabelle, die HSQLDB nicht hat, beteiligt) wäre:

call NEXT VALUE FOR [sequence_name]; 

Dies schien in 1.7.2 und dieser seine tatsächlich, wie Hibernate-Sequenzen in den HSQLDialect von "jüngsten" Versionen von Hibernate Core-Griffen ( HHH-2839 sehen).

Und in der Tat ist es das, was ich in die sehen HSQLDialect von hibernate-core-3.3.0.SP1.jar:

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

Also mein Rat ist: ein Upgrade auf eine neuere Version von Hibernate, verwenden Sie sehr wahrscheinlich, Hibernate Core-3.2.5 oder vor .

+0

@ hatchetman82 Gern geschehen. BTW: Der übliche Weg, eine gute Antwort zu erkennen, besteht darin, sie zu verbessern;) –

+1

@ hatchetman82 Kein Problem. Es ist nur so, dass wenn Sie eine Antwort als eine gute Antwort betrachten (was sehr wahrscheinlich ist, wenn Sie es akzeptieren), dann macht es Sinn, sie zu verbessern IMO, so funktioniert SO. –

+0

Hallo, das kann verwandt sein. Ich benutze Apache's DdlUtils, um die Datenbank beim Start zu generieren, indem ich dieses XML für die ID benutze: ''. Was soll ich tun, um beim Einfügen von Objekten einen neuen Schlüsselwert zu erhalten? Ich benutze auch iBatis. –

2

Anscheinend, wenn Sie laufen

SET DATABASE SQL SYNTAX PGS (PGS für Postgres stehend)

dann können Sie es abfragen Standard Postgres Syntax wie select nextval('sequence_name')http://hsqldb.org/doc/guide/dbproperties-chapt.html

Beachten Sie auch, dass, wenn Sie einmal tun, um diese typische HSQLDB Sequenz wie call NEXT VALUE FOR SEQUENCE_NAME wird nicht mehr funktionieren.

Verwandte Themen