2012-04-04 19 views
0

Der Fehler erhalte ich:Derby Boolean/Integer Umwandlung in JPQL

ERROR 42821: Columns of type 'BOOLEAN' cannot hold values of type 'INTEGER'. 

Für die JPQL Abfrage:

SELECT b.id FROM Bar b WHERE b.latest = true 

Offenbar weil Hibernate einen Booleschen Feld abbildet (dh „latest) auf eine ganze Zahl Spalte für JavaDB/Derby. Dies geschieht jedoch nur, wenn auf die Spalte in JPQL zugegriffen wird. Gleiches Ergebnis bei Verwendung der Kriterien-API.

Hibernate wurde auf org.hibernate.dialect.DerbyDi festgelegt alect und für den Fahrer org.apache.derby.jdbc.EmbeddedDriver.

Gleiches Ergebnis für andere Versionen des JDBC-Treibers.

Vermutlich besteht die Problemumgehung darin, die Spalte einem einzelnen Zeichen zuzuordnen, das "Y" und "N" enthält. Aber ich würde es lieber richtig machen.

Ist jemand auch auf dieses Problem gestoßen?

Antwort

1

Pass wahr als Abfrageparameter

SELECT b.id FROM Bar b WHERE b.latest = :latest 

sicher funktionieren.

0

Vielleicht passt Ihr Hibernate DerbyDialect nicht genau zu Ihrer Version von Derby. Die Behandlung von BOOLEAN-Datentypen durch Derby hat einige Releases geändert, und ich denke, dass Sie sicherstellen müssen, dass die Clients die richtigen JDBC-APIs verwenden, die dem BOOLEAN-Datentyp entsprechen. Eine ältere Version von Derby unterstützt nur INTEGER, nicht BOOLEAN.

Weitere Details in Ihrer Frage wäre sehr wertvoll. Notieren Sie sich die genauen Versionen aller beteiligten Softwarepakete, schließen Sie den vollständigen Stack-Trace der aufgetretenen Fehlermeldung ein und veröffentlichen Sie einen Ausschnitt des Quellcodes des genauen Ortes in Ihrem Programm, an dem der Fehler auftritt.

+0

könnte sein, dass diese Änderung in [10.8.1.2] (https://db.apache.org/derby/releases/release-10.8.1.2.html#Overview) ist, was die aktuelle Version ist. – oers

+0

Ich habe die letzten drei Versionen ausprobiert: 10.8.2.2, 10.8.1.2 und 10.7.1.1. Alles mit der eingebetteten Datenbank. –