【发布时间】: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”规范中,我可以看到正在设置的正确值。
有人知道我错过了什么吗?非常感谢
【问题讨论】: