gpt4 book ai didi

java - 使用 CriteriaBuilder 过滤多个 ENUM 值

转载 作者:太空宇宙 更新时间:2023-11-04 09:21:15 25 4
gpt4 key购买 nike

我想使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com