我以前并没有使用Java的枚举类来表示常量值,而是使用了“public final”方法。现在我开始使用枚举类,并且覆盖toString()方法以返回与枚举名称不同的值。
我有一些JPA代码,在其中使用命名参数创建TypedQuery,其中之一是枚举值的字符串表示形式。如果我仅使用Status.ACTIVE设置参数,则会得到正确的“A”值,但是会抛出异常,因为它的类型实际上是Status而不是字符串。只有当我显式地调用toString()方法时,它才起作用。我认为简单地覆盖toString()方法会导致返回String类型,无论类类型是什么。
这是该枚举类:
这是TypedQuery:
我有一些JPA代码,在其中使用命名参数创建TypedQuery,其中之一是枚举值的字符串表示形式。如果我仅使用Status.ACTIVE设置参数,则会得到正确的“A”值,但是会抛出异常,因为它的类型实际上是Status而不是字符串。只有当我显式地调用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());
query.setParameter("status", Status.ACTIVE+"");
。 - Eric@Entity
中的字段是否为Status
类型,并且是否使用了@Enumerated(EnumType.STRING)
注解?如果是,那么你应该可以在查询中很好地使用枚举。 - Tomasz Nurkiewicz