[Java] Que faire si le contenu enregistré dans la base de données et le nom de l’énumération sont différents dans l’énumération qui reflète la définition de la base de données

Contenu du problème

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.

Faire face

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*/

Une autre idée

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` ...

Articles que j'ai utilisés comme référence

Recommended Posts

[Java] Que faire si le contenu enregistré dans la base de données et le nom de l’énumération sont différents dans l’énumération qui reflète la définition de la base de données
Et si les résultats de sum et inject (: +) sont différents?
Que faire si les modifications ne sont pas reflétées dans le fichier manifeste JAR
Que faire si vous ne pouvez pas obtenir le texte d'un élément dans Selenium
Que faire si vous ne pouvez pas exécuter avec la commande "nom du package Java / nom de la classe"
[Maven] Que faire si on vous demande d’incorporer dans la guerre un fichier jar qui n’est pas dans le référentiel distant
[Rails] Que faire lorsque l'erreur Aucune base de données sélectionnée et Base de données inconnue apparaît dans db: migrate
[Rails] Que faire si les données ne sont pas enregistrées dans la base de données
Que faire lorsque les modifications du servlet ne sont pas reflétées
Que faire si la page Rails n'est pas affichée dans le didacticiel Rails 1.3.2
Que faire lorsque Cloud 9 est plein dans le didacticiel Rails
Implémentons la condition que la circonférence et l'intérieur de la forme Ougi soient inclus dans Java [Partie 2]
Juger si les chaînes de caractères à comparer sont les mêmes en Java
Que faire si vous oubliez votre mot de passe root sur CentOS7
Que faire lorsque le préfixe c n'est pas lié dans JSP
Le problème que le contenu des paramètres est complètement affiché dans la vue [Rails]
L'histoire de l'oubli de fermer un fichier en Java et de l'échec
Ceci et cela de la mise en œuvre du jugement en temps réel des dates en Java
Quelles sont les fonctionnalités mises à jour de Java 13
Si vous utilisez Android Room et que vous souhaitez modifier la définition de colonne
10 barrages de dessin avec ● ou ■ qui sont susceptibles d'apparaître dans la formation (Java)
Que faire si le serveur Tomcat meurt
Comment obtenir le nom de classe de l'argument de LoggerFactory.getLogger lors de l'utilisation de SLF4J en Java
Que faire si l'annotation JSON Hint ne fonctionne pas avec Lombok et JSONIC
[Java] Le problème selon lequel les images téléchargées ne sont pas mises à jour en raison de l'influence du cache
Que faire si le point d'arrêt est grisé et ne s'arrête pas pendant le débogage
Que faire si vous sélectionnez un JRE dans Eclipse et obtenez "Le JRE sélectionné ne prend pas en charge le niveau de conformité actuel 11"
Que faire si l'installation du gem de débogage échoue
Que faire si le serveur Rails ne peut pas démarrer
Java: utilisez Stream pour trier le contenu d'une collection
Un programme (Java) qui génère la somme des nombres pairs et impairs dans un tableau
Crier Java au cœur des technologies-Thèmes et technologies élémentaires que les ingénieurs Java devraient poursuivre en 2017-
[Rails] Que faire si vous effectuez accidentellement une installation groupée dans un environnement de production de votre environnement local
Comment écrire des commentaires dans le fichier de définition de schéma dans GraphQL Java et les refléter dans GraphiQL et GraphQL Playground
Que dois-je faire après janvier 2019 concernant le problème du paiement Java et le problème de la fin du support Java 8?
[Tutoriel Rails Chapitre 2] Que faire lorsque vous faites une erreur dans le nom de la colonne
Mémo qui passe à l'écran de connexion si vous n'êtes pas connecté avec l'appareil
Comment obtenir le nom d'une classe / méthode exécutée en Java
Que faire lorsqu'une exception java.io.IOException se produit dans GlassFish
J'ai essayé de résumer les bases de kotlin et java
Commande pour vérifier le nombre et l'état des threads Java
Que s'est-il passé dans «Java 8 to Java 11» et comment créer un environnement
Comment dériver le dernier jour du mois en Java
Que faire si la commande adb ne peut pas être exécutée
Que faire si la commande rails devient inutilisable
Que faire lorsque la "relation" hibernate_sequence "n'existe pas" dans la colonne ID de PostgreSQL + JPA
[Java] Je veux vérifier que les éléments de la liste sont nuls ou vides [Collection Utils]
Fonction statique pour vérifier si l'erreur RVB de BufferdImage est dans le rapport spécifié en Java
[Java] Que faire si un grand nombre de "Le fichier est trop ouvert" s'affiche en raison de FileNotFoundException
[Note de lecture] Principes de conception de système utiles sur le terrain - "Petit et facile à comprendre"
Emplacement de la définition de la méthode Résumé de la vérification Lorsque défini dans le projet et Rails / Gem
Lisez les données de Shizuoka Prefecture Point Cloud DB avec Java et essayez de détecter la hauteur de l'arbre.