[Java] Was tun, wenn sich der in der Datenbank gespeicherte Inhalt und der Name der Aufzählung in der Aufzählung unterscheiden, die die Definition der Datenbank widerspiegelt?

Inhalt des Problems

Es war eine Kopie der DB-Tabellendefinition, wie sie war, und sie wurde mit "_" definiert, da die reservierten Wörter und Definitionen abgedeckt waren.

Problematische Aufzählung


public enum Moge {
    hoge("hoge"), fuga("fuga"), _native("native"); //native ist ein reserviertes Wort

/*Kürzung*/

Hier wurde das Abfrageergebnis zu "Jdbc" mit "Enum.valueOf" zugeordnet, aber der Wert, der von der Datenbank abgerufen werden kann, ist "native", was sich von "_native" unterscheidet, sodass er nicht zugeordnet werden konnte.

Bewältigung

Ich habe eine Anmerkung erstellt, die das Feld übermittelt, das dem Wert entspricht, der aus der Datenbank entnommen werden kann, und die Zuordnung durch Verarbeiten der Anmerkung mit Reflexion ermöglicht.

MapByValue


@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface MapByValue {
    String value();
}

Aussehen der Anmerkung


public enum Moge {
    hoge("hoge"), fuga("fuga"),
    @MapByValue(value = "native") _native("native"); //native ist ein reserviertes Wort

/*Unten weggelassen*/

So verarbeiten Sie Anmerkungen


@SuppressWarnings("unchecked")
private Object mapEnum(Class<?> clz, String columnValue) {
    /*Kürzung*/

    String finalColumnValue = columnValue;
    columnValue = Arrays.stream(clz.getFields()) //Holen Sie sich alle Felder
            .filter(it -> {
                //Wenn eine MapByValue-Annotation hinzugefügt wird und der Wert gleich colmunValue ist
                MapByValue mapByValue = it.getAnnotation(MapByValue.class);
                return mapByValue != null && mapByValue.value().equals(finalColumnValue);
            })
            .findFirst()
            .map(Field::getName) //Verwenden Sie den Namen des angegebenen Feldes
            .orElse(finalColumnValue);

    return clz.cast(Enum.valueOf((Class<Enum>) clz, columnValue));
}

@SuppressWarnings("rawtypes")
@Override
protected Object getColumnValue(ResultSet rs, int index, PropertyDescriptor pd) throws SQLException {
    Class<?> clz = pd.getPropertyType(); //Typinformationen abrufen

    /*Kürzung*/

    if (clz.isEnum()) { //Für Aufzählung
        byte[] bytes = rs.getBytes(index);
        if (isEmpty(bytes)) {
            return null;
        }

        return mapEnum(clz, new String(bytes, Charset.forName("UTF-8")));
    }

    /*Kürzung*/

Eine andere Idee

Da alle "Aufzählungen" eine Funktion zum Konvertieren von einem Wert in "Aufzählung" hatten, um die Konvertierung von Json zu vereinfachen, habe ich darüber nachgedacht, diese aus der Reflexion zu verwenden, aber es ist vielseitiger, sie mit Anmerkungen zu verarbeiten. Ich habe mich entschieden. Ich wünschte, ich könnte den Wert von überschreiben ...

Artikel, die ich als Referenz verwendet habe

Recommended Posts

[Java] Was tun, wenn sich der in der Datenbank gespeicherte Inhalt und der Name der Aufzählung in der Aufzählung unterscheiden, die die Definition der Datenbank widerspiegelt?
Was ist, wenn die Ergebnisse von Summe und Injektion (: +) unterschiedlich sind?
Was tun, wenn die Änderungen nicht in der JAR-Manifestdatei berücksichtigt werden?
Was tun, wenn Sie den Text eines Elements in Selen nicht abrufen können?
Was tun, wenn Sie den Befehl "Java-Paketname / Klassenname" nicht ausführen können?
[Maven] Was tun, wenn Sie aufgefordert werden, ein Glas, das sich nicht im Remote-Repository befindet, in den Krieg aufzunehmen?
[Rails] Was tun, wenn der Fehler Keine Datenbank ausgewählt und Unbekannte Datenbank in db: migrate angezeigt wird?
[Rails] Was tun, wenn keine Daten in der Datenbank registriert sind?
Was tun, wenn die Änderungen im Servlet nicht berücksichtigt werden?
Was tun, wenn die Rails-Seite im Rails-Lernprogramm 1.3.2 nicht angezeigt wird?
Was tun, wenn Cloud 9 im Rails-Lernprogramm voll ist?
Implementieren wir die Bedingung, dass der Umfang und das Innere der Ougi-Form in Java enthalten sind [Teil 2]
Beurteilen Sie, ob die zu vergleichenden Zeichenfolgen in Java identisch sind
Was tun, wenn Sie Ihr Root-Passwort unter CentOS7 vergessen haben?
Was tun, wenn das Präfix c in JSP nicht gebunden ist?
Das Problem, dass der Inhalt von Parametern vollständig in der Ansicht [Rails] angezeigt wird
Die Geschichte, zu vergessen, eine Datei in Java zu schließen und zu scheitern
Dies und das der Implementierung der zeitlichen Beurteilung von Daten in Java
Was sind die aktualisierten Funktionen von Java 13
Wenn Sie Android Room verwenden und die Spaltendefinition ändern möchten
10 Sperrfeuer mit ● oder ■, die wahrscheinlich im Training auftreten (Java)
Was tun, wenn der Server-Tomcat stirbt?
So erhalten Sie den Klassennamen des Arguments von LoggerFactory.getLogger, wenn Sie SLF4J in Java verwenden
Was tun, wenn die Annotation JSON Hint nicht mit Lombok und JSONIC funktioniert?
[Java] Das Problem, dass hochgeladene Bilder aufgrund des Einflusses des Caches nicht aktualisiert werden
Was tun, wenn der Haltepunkt schattiert ist und beim Debuggen nicht stoppt?
Was tun, wenn Sie in Eclipse eine JRE auswählen und "Die ausgewählte JRE unterstützt die aktuelle Konformitätsstufe 11 nicht" erhalten?
Was tun, wenn die Installation des Debug-Gems fehlschlägt?
Was tun, wenn der Rails-Server nicht gestartet werden kann?
Java: Verwenden Sie Stream, um den Inhalt einer Sammlung zu sortieren
Ein Programm (Java), das die Summe von ungeraden und geraden Zahlen in einem Array ausgibt
Rufen Sie Java im Zentrum von Technologiethemen und Elementartechnologien, die Java-Ingenieure 2017 verfolgen sollten.
[Rails] Was tun, wenn Sie versehentlich eine Bundle-Installation in einer Produktionsumgebung in Ihrer lokalen Umgebung durchführen?
So schreiben Sie Kommentare in die Schemadefinitionsdatei in GraphQL Java und spiegeln sie in GraphiQL und GraphQL Playground wider
Was soll ich nach Januar 2019 in Bezug auf die Ausgabe der Java-Zahlung und die Ausgabe des Java 8-Endes des Supports tun?
[Rails Tutorial Kapitel 2] Was tun, wenn Sie einen Fehlern im Spaltennamen machen?
Notiz, die zum Anmeldebildschirm übergeht, wenn Sie nicht mit devise angemeldet sind
So erhalten Sie den Namen einer Klasse / Methode, die in Java ausgeführt wird
Was tun, wenn in GlassFish eine java.io.IOException auftritt?
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
Befehl zum Überprüfen der Anzahl und des Status von Java-Threads
Was ist in "Java 8 bis Java 11" passiert und wie wird eine Umgebung erstellt?
So leiten Sie den letzten Tag des Monats in Java ab
Was tun, wenn der Befehl adb nicht ausgeführt werden kann?
Was tun, wenn der Befehl Rails unbrauchbar wird?
Was tun, wenn "Relation" hibernate_sequence "nicht existiert" in der ID-Spalte von PostgreSQL + JPA
[Java] Ich möchte überprüfen, ob die Elemente in der Liste null oder leer sind. [Collection Utils]
Statische Funktion, um zu überprüfen, ob der RGB-Fehler von BufferdImage innerhalb des angegebenen Verhältnisses in Java liegt
[Java] Was tun, wenn aufgrund von FileNotFoundException viel "Datei wird zu oft geöffnet" angezeigt wird?
[Lesung Memo] Prinzipien des Systemdesigns nützlich im Bereich "Klein und leicht zu verstehen"
Speicherort der Methodendefinition Zusammenfassung der zu überprüfenden Informationen Wenn im Projekt und in Rails / Gem definiert
Lesen Sie die Daten der Shizuoka Prefecture Point Cloud DB mit Java und versuchen Sie, die Baumhöhe zu ermitteln.