带枚举的{JPA 2 Criteria API}

时间:2017-09-21 13:41:34

标签: java hibernate jpa jpa-2.0 criteria

我有以下实体:

public class Role extends AbstractDomain<Long> {
    @Id
    @Column
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "idgen_x")
    @UiInfo(name = "Identifiant")
    private Long roleId;

    @Column
    @UiInfo(name = "Libellé")
    private String lib;

    @Column
    @UiInfo(name = "Provenance")
    private EnumP enumPID;
}

EnumP:

public enum EnumP {
    W, X, Y, Z;
}

使用JPA Criteria API我希望获得Role的列表,其中数组中的Role.enumPID包含枚举值为字符串。

这是我尝试Predicate的代码:

builder.isTrue(fromRole.get(Role_.enumPID).in((Object[]) filter.getFilterSetValues()))

filter.getFilterSetValues()包含枚举值作为字符串,如下所示:

["X","Y"]

但我收到此错误消息:

java.lang.IllegalArgumentException: Parameter value [X] did not match expected type [***.EnumP (n/a)]

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

您应首先充分注释枚举字段:

@Enumerated(EnumType.STRING)
@UiInfo(name = "Provenance")
private EnumP enumPID;

然后,您应该将查询中的特定EnumP元素用作params,而不是它们的String等价物。

您需要将字符串集合转换为EnumP对象的相应集合:

public static List<EnumP> fromStringArray(String[] array){
    List<EnumP> returnList = new ArrayList<>; 

    for(String element: array){
       for(EnumP enumP: EnumP.values()){
          if(enumP.name().equals(element)){
             returnList.add(enumP);
          }
       }
    }    

    return returnList;
}