【问题标题】:JPA 2 Criteria API with enums带有枚举的 JPA 2 标准 API
【发布时间】:2017-09-21 13:41:34
【问题描述】:

我有以下实体:

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;
}

枚举:

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)]

我该如何解决这个问题?

【问题讨论】:

    标签: java hibernate jpa jpa-2.0 criteria


    【解决方案1】:

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

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

    那么您应该在查询中使用特定的 EnumP 元素作为参数,而不是它们的 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;
    }
    

    【讨论】:

    • 感谢您的回答,但我该如何使用特定的 EnumP 元素?因为我将它们作为字符串获取(因为我将一个 json 对象传递给我的 Rest 类,然后我将枚举值传递给我的 dao 类,所以我可以获得它们的唯一方法是作为字符串)
    • 那么您需要考虑简单地将变量设置为 String 而不是 EnumP 类型。如果您使用枚举,则必须在 EnumP 中创建某种 util 方法,该方法将基于 String 列表作为输入返回 EnumP 元素列表
    • Unfurtunatly 我不能将enumPID 设为字符串,所以我猜第二种解决方案可能适用于这种情况,所以你告诉我在EnumP 中我必须创建一个方法将字符串数组作为参数,然后返回相应的 EnumP 元素,但是如何做到这一点?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    相关资源
    最近更新 更多