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