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());
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
Vous devez vous connecter pour publier un commentaire.
Est le domaine
status
de la MechanicTimeEvent bean un type enum?Si pas, je suggère de modifier le type enum
Status
.Vous pouvez l'annoter avec
@Enumerated(EnumType.STRING)
Plus, j'aimerais proposer de supprimer la valeur de la partie de votre enum et
suffit d'utiliser des noms comme:
Avez-vous utilisé la valeur d'enum au lieu de string?: ie requête.setParameter("statut", au Statut.ACTIVE)
En fait, le problème est que, depuis la base de données stocke uniquement les valeurs, c'est à dire: A, P ou F, puis lors de la création d'une instruction select, OpenJPA passe à la valeur renvoyée par la requête de la méthode valueOf de l'enum. Car il ne trouve pas dans l'enum, il lève l'exception. La méthode valueOf est définitif, donc je ne peux pas le remplacer.
Ah, ouais. Peut-être un inconvénient, mais lors de l'utilisation des enums en combinaison avec JPA seulement les noms de comte, pas les valeurs. Personnellement, je viens de supprimer le valeur de propriété et d'utiliser uniquement la clé noms de l'enum. Voir mon bjoetified réponse 😉
Hey lauwie, j'ai compris la façon de traiter avec elle. J'ai fini par commutation de OpenJPA à EclipseLink. Avec EclipseLink, je suis capable de définir mon enum aussi simple, comme vous l'avez sans un constructeur, alors dans mon champ entity, j'ai ajouter un couple EclipseLink annotations pour la prise en charge de la conversion. Vérifiez le Résumé que je viens de poster. gist.github.com/1287713
OriginalL'auteur lauwie
... comme la Question de la solution fournit. Ce code est plus lisible et de la localité entre la "Chaîne de la cartographie" (
ACTIVE ("A")
), permet également d'éviter l'exécution de code avec les fautes de frappe (c'est à dire:case 3: name = "E"
au lieu decase 2: name = "F"
). Aussi, le commutateur de valeur par défaut est vide de sens.OriginalL'auteur Lazy Beard
Si je comprends votre question correctement, Vous devriez faire l'énumération de mappage inverse. De cette façon, les états sont stockés en tant qu'etat et de JPA pour traiter les enum basé sur son nom, A,P, F).
De cette façon, vous pouvez simplement passer du Statut sans faire appel à la méthode toString() de JPA. L' .nom de la (les) méthode sur l'ENUM sera automatiquement invoqué pour obtenir le code d'état de la persistance.
.name()
?Enum.nom() la méthode est définitive ne peut donc pas être remplacé.
Le but de la faire de la même manière, je l'ai, donc si quelqu'un lit le code, Statut.ACTIVE est de plus évident que l'État.Un.
Comme le Java API docs les points en gras: la plupart des programmeurs doivent utiliser les méthodes toString(). Primordial
toString()
est le droit chemin.OriginalL'auteur java_mouse
toString
est juste une méthode ordinaire dans l'Objet qui est explicitement demandé par certaines méthodes, comme PrintStream.println (souvenez-vous du Système..println) ou considérés lors de la concaténation de l'aide de l'opérateur+. Pas chaque méthode doit implémenter ce comportement.Je vous suggère d'utiliser un plus descriptif nom de la méthode comme
getValue
et de l'appeler explicitement au lieu de remplacertoString
OriginalL'auteur Jagat
Ce ou tout simplement vous mettre en œuvre un getter pour la valeur:
Et que vous appelez dans votre code:
OriginalL'auteur Cygnusx1
tout comme le loft dire ,vous pouvez utiliser le "nom" de la méthode pour obtenir le nom.
vous pouvez également utiliser la méthode toString ().
bien sûr, c'est juste le nom de cette constante enum.
OriginalL'auteur zg_spring