Oracle "boolean", um Java-Boolean - how, um automatisch konvertieren

Entwickle ich ein DB-layer, mit Hilfe von JDBC (ojdbc6.jar), das erlaubt, um eine grundlegende DB-Operationen durch die erste und die Rückgabe einer Karte mit Name/Wert-Paaren. Zum Beispiel:

map.put("StrField", "str");
map.put("IntField", 10);
map.put("BoolField", true);
DB.insert(tableName, map);
...
map = DB.query("SELECT * from MY_TABLE.."); //assuming this returns only one row
Boolean flag = map.get("BoolField");
//etc...

Die insert-operation ist leicht zu implementieren, weil die Umwandlung von Java-primitiven Datentypen in Oracle-Datentypen ist einfach und intuitiv.

Für die entgegengesetzte Richtung (Oracle->Java) die Korrektur ist etwas tricky. Ich schaffte es, alle Typen außer "Boolean". Da gibt es keinen BOOLEAN-Datentyp in Oracle-DB, ich bin auf der Suche nach einer Möglichkeit, ein Feld definieren, so dass meine retrieval-Schicht eindeutig zu identifizieren, wie ein Feld als Boolean.

Der beste Weg den ich bisher gefunden ist, etwas zu verwenden, wie diese:

BOOL_FIELD CHAR(1) DEFAULT 0 NOT NULL CHECK (BOOL_FIELD in (0, 1))

Plus, ich sicherstellen, dass ich nicht verwenden(CHAR (1) überall in meiner DB, außer bei "Boolean" ist erforderlich. Dies ist keine große Einschränkung, da CHAR(1) ist nicht sehr nützlich, für alles andere sowieso.

Und in meinem Java-conversion-code, ich prüfe, ob ein bestimmtes Feld zurückgegeben wird java.sql.Types.CHAR (über ResultSetMetaData.getColumnType() nennen), und ich auch schauen, dass die Größe des Feldes ist 1, in dem Fall kann ich sicher aufrufen ResultSet.getBoolean() - und Feld-Wert als Java-Boolean-Datentyp.

So weit, es funktioniert wirklich gut, aber jetzt habe ich ein problem mit externen Datenbanken, also Datenbanken, in denen ich nicht kontrollieren kann die Tabelle/Spalte definition. Für solche Datenbanken, ich bin nicht in Ordnung, Boolesche Werte, aber ich Frage mich, wie ich unterscheiden kann, meine "Boolean" aus einfach nur ein normaler CHAR(1), dass jemand anderes mit in der externen Datenbank.

Konnte ich ignorieren dies völlig, und im Fall CHAR(1) Boolean-Werte true/false, aber das war nicht meine Absicht. Zum Beispiel, wenn ein bestimmter CHAR(1) - Spalte hat den Wert 'X' (unmöglich für meine Datenbank, aber gültig Fall in der externen Datenbank), dann ist meine conversion-code zurück true anstelle von 'X'.

Ich bin auf der Suche nach einigen "Metadaten" oder trick, die ich hinzufügen kann, um meine "BOOLEAN" DB-Feld, so dass mein JDBC-Schicht konnte diesen Metadaten und wenn er es - davon ausgehen, es ist MEINE booleschen und nicht jemand anderes CHAR(1), die sieht ähnlich aus.

Irgendwelche Ideen auf, wie ein trick (wenn auch nicht 100% sicher, aber ziemlich sicher)?

Dank.

Bearbeiten
Nur als Beispiel, mit RAW(1) in Oracle würde den trick perfekt, denn es ist nahe-zu-null-chance für jedermann überall wird mit RAW(1) für etwas anderes. Das problem mit RAW(1) ist, dass es wirklich schwer ist, zur Verwendung in SQL-Abfragen, d.h. es ist schwer zu tun, WO mit solchen "boolean" - definition.

  • Wenn Sie die Ergebnismenge direkt, statt über eine Karte, die nicht viel hinzuzufügen Wert das Ergebnis würde die entsprechenden, gut definierten conversion für Sie.
  • mögliche Duplikate von stackoverflow.com/questions/3726758/...
  • Warum gibst du ein CHAR-Feld in einen numerischen Wert? Sollte es nicht '0' oder '1', oder erstellen Sie eine Nummer ein(1) Feld.
  • Ich BIN mit ResultSet in meinem Daten-Schicht, wie Sie sehen können. Das problem ist, dass mein code sollte in der Lage sein zu entscheiden, automatisch, Wann rs.getBoolean() und Wann rs.getString(). Vorstellen ich dann serialisieren Sie die abgerufenen Daten in JSON - ich will Booleans zu erscheinen, als true/false und nicht als "1"/"0" in meiner JSON. Die Frage ist, wie Sie dies tun, indem Sie ResultSet, wenn ich nicht weiß, ob ein bestimmtes Feld war dazu gedacht, bool, ich weiß nur, seine Oracle-DB-definition.
  • Ich brauche nicht zu Fragen, ob es eine Boolean in Oracle. Ich weiß es nicht. Das ist, warum ich bin auf der Suche nach einem alternativen Weg, um zu konvertieren, was zur Verfügung STEHT, die in Oracle Java-Boolean.
  • in der obigen SQL-definition, die ich verwende, werden die Werte gespeichert als '1' und '0' (d.h. die DB speichert Sie als ASCII 48 und 49 intern). Ironischerweise, dies ist ein problem für mich, da würde ich lieber DB speichern Sie Sie als ASCII - 00 und 01, in diesem Fall konnte ich "erkennen", dass es "meine" boolean". Das problem ist, dass wenn ich dies tun (z.B. durch die Verwendung CHR(0)), ResultSet.setBoolean(true) scheitert mit Ausnahme!!!
  • Mein Punkt ist, dass der Anrufer sollte wissen und entscheiden, was es zu Holen, und in welchem format, aus dem ResultSet. Sie versuchen zu erraten, die aus den Metadaten und entscheiden Sie sich für die Anrufer. Wenn der Anrufer direkt in das Ergebnis gesetzt, er könnte anrufen, getBoolean() oder getString() auf die gleiche Spalte, und würden beide arbeiten und zurückgeben, was er will zurückkehren. Die Wahl der Art zu verwenden, sollte nicht von der Art der columnin der Datenbank, sondern von dem, was der Anrufer will mit dieser Spalte.
  • IMHO ist das Grundprinzip, und einer der wichtigsten Gründe, zu haben Arten - ist für die Nutzer der Daten in der Lage sein, um die Daten in die richtigen und verwendbaren format. Meine ursprüngliche Anrufer ist eigentlich ein browser-client, bekommen JSON, der Kunde kümmert sich nicht darum, Oracle DB-Beschränkungen, die der client haben will true/false und ich kann es ihm verdenken, denn es ist ein sehr vernünftiger Wunsch. Was Sie vorschlagen, ist, um mid-layer-bewusst zu sein, die client-Logik. In anderen Worten, wenn der Kunde weiß, es will Boolean-Feld, mid-layer sollten replicate all das wissen, auch. Und das ist nicht skalierbar. Tnx.
  • hast du Antwort von ammoQ
  • natürlich. Ich weiß, dass es kein Boolean in Oracle, das ist, warum ich nenne es "boolean". Ich bin auf der Suche nach Abhilfe, in Oracle, so kann ich sicher glaube, in meinem java-code, ein Feld behandelt werden sollten als Java-Boolean, bei der Konvertierung von Oracle-ResultSet-Daten in Java.

Schreibe einen Kommentar