我之前从未真正使用Java枚举类来获取常量值,我过去通常使用“公共最终”方法。我现在开始使用枚举,并且我重写了toString()方法以返回与枚举名称不同的值。
我有一些JPA代码,其中我正在创建一个带有命名参数的TypedQuery,其中一个是枚举值的String表示形式。如果我只使用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());
答案 0 :(得分:5)
public enum Status {
ACTIVE,
PENDING,
FINISHED;
@Override
public String toString() {
String name = "";
switch (ordinal()) {
case 0:
name = "A";
break;
case 1:
name = "P";
break;
case 2:
name = "F";
break;
default:
name = "";
break;
}
return name;
}
};
答案 1 :(得分:3)
如果我理解你的问题,你应该以其他方式进行枚举映射。通过这种方式,状态存储为状态,JPA将根据其名称A,P,F处理枚举。
public enum Status {
A("ACTIVE"),
P("PENDING"),
F("FINISHED");
通过这种方式,您可以在不调用toString()方法的情况下传递Status到JPA。将自动调用ENUM上的.name()方法以获取持久性的状态代码。
答案 2 :(得分:3)
MechanicTimeEvent bean的字段status
是枚举类型吗?
如果没有,我建议将其更改为枚举类型Status
。
您可以使用@Enumerated(EnumType.STRING)
此外,我建议删除枚举的值部分 只需使用如下名称:
public enum Status {
ACTIVE,
PENDING,
FINISHED;
}
答案 3 :(得分:0)
这个或者您只是为值实现一个getter:
public String getValue()
你在代码中调用它:
query.setParameter("status", Status.ACTIVE.getValue());
答案 4 :(得分:0)
toString
只是Object中的一个普通方法,由PrintStream.println(记住System.out.println)等一些方法显式调用,或者在使用+运算符连接时考虑。并非每种方法都需要实现此行为。
我建议您使用更具描述性的方法名称,例如getValue
并明确调用它而不是覆盖toString
答案 5 :(得分:-1)
java.lang.Enum said clearly:
/**
* Returns the name of this enum constant, exactly as declared in its
* enum declaration.
*
* <b>Most programmers should use the {@link #toString} method in
* preference to this one, as the toString method may return
* a more user-friendly name.</b> This method is designed primarily for
* use in specialized situations where correctness depends on getting the
* exact name, which will not vary from release to release.
*
* @return the name of this enum constant
*/
public final String name()
就像阁楼说的那样,你可以用“名字”的方法来获取名字。
你也可以使用toString()方法。
当然它只是这个枚举常量的名称。