Я никогда прежде не использовал классы перечисления Java для постоянных значений, в прошлом я обычно использовал подход "public final". Сейчас я начал использовать enum и переопределяю метод toString (), чтобы он возвращал значение, отличное от имени enum.
У меня есть некоторый код JPA, в котором я создаю TypedQuery с именованными параметрами, одним из которых является строковое представление значения перечисления. Если я просто устанавливаю параметр с помощью Status.ACTIVE, я получаю правильное значение «A», но возникает исключение, потому что его тип на самом деле является Status, а не String. Это работает, только если я явно вызываю метод toString (). Я думал, что простое переопределение метода toString () приведет к возвращению типа String независимо от типа класса.
Это перечисление:
public enum Status {
ACTIVE ("A"),
PENDING ("P"),
FINISHED ("F");
private final String value;
Status(String value) {
this.value = value;
}
public String toString() {
return value;
}
};
Это 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());