java - 使用 CriteriaBuilder 过滤多个 ENUM 值

标签 java criteria predicate

我想使用 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”过滤器),我收到以下错误:

Parameter value [SALE] did not match expected type [com.mycompany.domain.enums.ActionContext

我还尝试用 .or() 替换 CriteriaBuilder.in 并放入解析 token 的集合,但我遇到了同样的错误。

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

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

最佳答案

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

希望它能帮助那些像我一样有时目光狭隘的人。

关于java - 使用 CriteriaBuilder 过滤多个 ENUM 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58305959/

相关文章:

database - 多标准搜索算法

ios - 谓词获取参数包含在特定 NSSet 中的对象

mysql - Spring Data JPA 在多列上使用 AND 子句并与 OR 子句组合

java - 如何解决数据冲突

java - 如何告诉 NetBeans 我的 Tomcat "home"在哪里?

java - 使用多个线程仅调用一次方法

jpa - 如何使用 JPA 2.1 CriteriaDelete 从连接表中删除实体

java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?

java hibernate标准问题

java - 仅使用谓词,不使用集合或数组,在 Java 中创建 Set 数据结构。如何实现迭代器相关功能?