Java enum primordial toString()

Je n'ai jamais vraiment fait de l'utilisation de Java énumérer les classes avant pour des valeurs constantes, j'ai toujours utilisé le "public final" approche dans le passé. J'ai commencé à utiliser un enum maintenant et je suis à la substitution de la méthode toString() pour retourner une valeur autre que celle de l'enum nom.

J'ai quelques JPA code dans lequel je crée un TypedQuery avec des paramètres nommés, dont l'un est une représentation de Chaîne de la valeur d'enum. Si je me contente de définir le paramètre à l'aide de l'État.ACTIVE, je reçois le "Un" de la valeur, mais une exception est levée, car c'est le type est en fait État plutôt que de la Chaîne. Il ne fonctionne que si je appeler explicitement la méthode toString (). Je pensais que la simple substitution de la méthode toString() seraient le résultat d'un type de Chaîne étant retourné, quel que soit le type de classe a été.

C'est l'enum:

public enum Status {
    ACTIVE ("A"),
    PENDING ("P"),
    FINISHED ("F");

    private final String value;

    Status(String value) {
        this.value = value;
    }

    public String toString() {
        return value;
    }
};

C'est le TypedQuery:

    TypedQuery<MechanicTimeEvent> query = entityManager().createQuery("SELECT o FROM MechanicTimeEvent o WHERE o.id.mechanicNumber = :mechanicNumber AND o.id.status = :status", MechanicTimeEvent.class);
    query.setParameter("mechanicNumber", mechanicNumber);
    query.setParameter("status", Status.ACTIVE.toString());
Pouvez ajouter la cartographie du champ de la question?
Si vous êtes à la recherche d'une manière plus concise de l'écrire, query.setParameter("status", Status.ACTIVE+""); fonctionne.
C'est dans le domaine de votre @Entity de type Status et il est annoté avec @Enumerated(EnumType.STRING)? Si donc vous devriez être en mesure d'utiliser les énumérations dans les requêtes de l'amende juste.
Ici et here des problèmes similaires et des réponses ont été déjà discuté.
Le champ dans ma @Entité est simplement une Chaîne de caractères, mais il ne sera jamais que la valeur de A, P ou F, j'ai donc créé un enum pour ces valeurs de façon à ce que, dans le code, j'ai pu utiliser quelque chose comme Statut.ACTIVE et qu'il serait plus descriptif. J'ai pensé substitution de la méthode toString() pour renvoyer la valeur réelle serait de retour d'un type de Chaîne sans appeler explicitement toString().

OriginalL'auteur Patrick Grimard | 2011-10-13