我的班级Role
有一个属性enumP
,即:
@Convert(converter = EnumPConverter.class)
@Enumerated(EnumType.STRING)
private EnumP enumP;
这是转换器:
@Converter(autoApply = false)
public class EnumPConverter implements AttributeConverter<EnumP, String> {
@Override
public String convertToDatabaseColumn(final EnumP attribute) {
switch (attribute) {
case X:
return "X";
case Y:
return "Y";
case Z:
return "Z";
default:
throw new DbException("Type of enumeration is unknown at the time of conversion to a DB value.",
new IllegalArgumentException("Value received : " + attribute));
}
}
@Override
public EnumP convertToEntityAttribute(final String dbData) {
switch (dbData) {
case "X":
return EnumP.X;
case "Y":
return EnumP.Y;
case "Z":
return EnumP.Z;
default:
throw new DbException("Unknown enumerated value was found in the DB",
new IllegalArgumentException("Value received : " + dbData));
}
}
}
这就是Enum:
public enum EnumP {
X, Y, Z;
}
当谓词是:
builder.isTrue(fromRole.get(Role_.enumP).in((Object[]) filter.getFilterSetValues()))
其中getFilterSetValues()
将返回一个String数组,如下所示:
["X", "Y"]
我得到以下异常:
Parameter value [X] did not match expected type [EnumP (n/a)]
我尝试在转换器上添加一个换行符,但调试器不会在该行中停止。
PS:我无权在Enum
中修改,因此应该在转换器内进行任何操作。
答案 0 :(得分:1)
如果您具有相同的值X-> X,Y-> Y,Z-> Z,为什么要使用转换器?
我认为@Enumerated(EnumType.STRING)
在你的情况下是足够的,不需要转换它们。
我同意@crizzis使用枚举的字符串值是一种不好的做法。更好的方法是实现getFilterSetValues以返回一个enump值数组
答案 1 :(得分:0)
由于Role.enumP
的类型为EnumP
,而getFilterSetValues()
返回字符串数组,因此存在明显的类型不匹配。您需要将EnumP
数组传递给in()
方法。