C'était une copie de la définition de la table DB telle qu'elle était, et elle a été définie avec _
parce que les mots réservés et les définitions étaient couverts.
Énumération problématique
public enum Moge {
hoge("hoge"), fuga("fuga"), _native("native"); //native est un mot réservé
/*réduction*/
Ici, le résultat de la requête sur Jdbc
a été mappé en utilisant ʻEnum.valueOf, mais la valeur qui peut être obtenue à partir de la base de données est
native, qui est différente de
_native`, donc elle n'a pas pu être mappée.
J'ai fait une annotation qui véhicule le champ correspondant à la valeur que l'on peut prendre dans la base de données, et j'ai rendu possible la cartographie en traitant l'annotation avec réflexion.
MapByValue
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface MapByValue {
String value();
}
Apparence de l'annotation
public enum Moge {
hoge("hoge"), fuga("fuga"),
@MapByValue(value = "native") _native("native"); //native est un mot réservé
/*Omis ci-dessous*/
Comment traiter les annotations
@SuppressWarnings("unchecked")
private Object mapEnum(Class<?> clz, String columnValue) {
/*réduction*/
String finalColumnValue = columnValue;
columnValue = Arrays.stream(clz.getFields()) //Obtenez tous les champs
.filter(it -> {
//Lorsque l'annotation MapByValue est ajoutée et que la valeur est égale à colmunValue
MapByValue mapByValue = it.getAnnotation(MapByValue.class);
return mapByValue != null && mapByValue.value().equals(finalColumnValue);
})
.findFirst()
.map(Field::getName) //Utilisez le nom du champ donné
.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(); //Obtenir des informations sur le type
/*réduction*/
if (clz.isEnum()) { //Pour enum
byte[] bytes = rs.getBytes(index);
if (isEmpty(bytes)) {
return null;
}
return mapEnum(clz, new String(bytes, Charset.forName("UTF-8")));
}
/*réduction*/
Puisque tous les ʻenum avaient une fonction pour convertir de valeur en ʻenum
pour la commodité de la conversion de Json, j'ai pensé à l'utiliser par réflexion, mais il est plus polyvalent de traiter avec des annotations. J'ai décidé.
Je souhaite pouvoir ʻOverride`` valueOf` ...