从JPA中的集合中的枚举搜索时类型错误

时间:2017-09-25 10:41:12

标签: java jpa enums jpa-2.0 criteria

我的班级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中修改,因此应该在转换器内进行任何操作。

2 个答案:

答案 0 :(得分:1)

如果您具有相同的值X-> X,Y-> Y,Z-> Z,为什么要使用转换器? 我认为@Enumerated(EnumType.STRING)在你的情况下是足够的,不需要转换它们。

我同意@crizzis使用枚举的字符串值是一种不好的做法。更好的方法是实现getFilterSetValues以返回一个enump值数组

答案 1 :(得分:0)

由于Role.enumP的类型为EnumP,而getFilterSetValues()返回字符串数组,因此存在明显的类型不匹配。您需要将EnumP数组传递给in()方法。