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.
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*/
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 ...
Recommended Posts