【问题标题】:Use CriteriaBuilder to filter IN multiple ENUM values使用 CriteriaBuilder 过滤多个 ENUM 值
【发布时间】:2020-02-06 21:33:19
【问题描述】:

我想用 CriteriaBuilder 构造一个查询,并在 where 指令中添加一个谓词,以从 ENUM 值的潜在列表中过滤我的一个对象字段。

尽管有类似的帖子:Filtering data with CriteriaBuilder to compare enum values with literals not working

我没有设法让我的代码工作。这是“简化”的对象:

//BUNCH OF ANNOTATIONS
public class Action {
    @Column(name = "CONTEXT")
    @Enumerated(EnumType.STRING)
    private ActionContext context = ActionContext.SALE;

    // ...
}

我的枚举是:

public enum ActionContext {
    SALE,
    ORDER,
    OTHER
}

在我的过滤器中,我可以收到例如“SALE,ORDER”之类的信息。

所以我创建了一个自定义规范,当我构建它时,我正在这样做:

private List<Predicate> filters = new ArrayList<>();
//...    
// filterValue is a String, it can be "SALE,ORDER" for ex.
case CONTEXT_FILTER_NAME:
                    if (filterValue != null && !filterValue.isEmpty()) {
                        String[] contextTokens = filterValue.split(",");

                        CriteriaBuilder.In<String> inClause = cb.in(root.get(CONTEXT_FILTER_NAME));
                        Arrays.asList(contextTokens).forEach(inClause::value);

                        filters.add(inClause);
                    }
                    break;

之后的部分只是进行查询,它适用于其他过滤器......但事实上我的实体有一个枚举:当我使用这些过滤器运行测试时(发送“SALE,ORDER”过滤器作为前),我得到以下错误:

参数值 [SALE] 与预期类型不匹配 [com.mycompany.domain.enums.ActionContext

我也尝试将 CriteriaBuilder.in 替换为 .or() 并放入已解析令牌的集合,但我遇到了同样的错误。

是的,我确定这不是解析错误,因为当我在这个 swich/case 部分放置断点时,我看到正确构造的 contextTokens 数组具有良好的价值。在“in”规范中,我可以看到正在设置的正确值。

有人知道我错过了什么吗?非常感谢

【问题讨论】:

    标签: java criteria predicate


    【解决方案1】:

    好的,我正在将 Enum 与 String 进行比较,但我没有看到这个... 因此,在这种情况下,您只需将 ActionContext ENUM 转换为 ActionContext.valueOf(token) 或反之,转换 root.get(CONTEXT_FILTER_NAME).as(String.class)

    希望它能帮助像我这样的人,有时是一种狭隘的视野。

    【讨论】:

      猜你喜欢
      • 2014-08-06
      • 1970-01-01
      • 1970-01-01
      • 2016-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-21
      • 1970-01-01
      相关资源
      最近更新 更多