【发布时间】:2015-04-04 21:39:17
【问题描述】:
我的实体Request 具有@ManyToMany Set<Region> regions,而Region 实体具有region 类型的枚举类型字段RegionEnum 和区域常量。
我需要创建标准来获取请求,其区域在 RegionEnum 的集合中;
在我的选择:
List<RegionEnum> regs=...; // from method parameter
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery<Request> cq=cb.createQuery(Request.class);
Root<Request> from=cq.from(Request.class);
cq.where(cb.isTrue(from.join("regions").get("region").in(regs)));
return em.createQuery(cq).getResultList();
我有一个java.lang.IllegalArgumentException: PREDICATE_PASSED_TO_EVALUATION (There is no English translation for this message.)
枚举:
public enum RegionEnum {
CENTRAL("Центральный"),
SOUTH("Южный"),
NWEST("Северо-Западный"),
FEAST("Дальневосточный"),
SIB("Сибирский"),
URFO("Уральский"),
VOLGA("Волжский"),
NCAU("Северо-Кавказский");
private final String value;
private Region(String value) {
this.value=value;
}
public String value() {
return this.value;
}
}
我的标准是否正确,枚举有问题吗?还是标准不好?
【问题讨论】:
-
在您的第一个代码片段中,您没有显示“regs”变量是什么。
-
我已添加 regs 来提问;我还尝试创建谓词数组
cb.equal(from.join("regions").get("region"),r);其中 r 来自for(RegionEnum r:regs),但我有一个 ClassCastException 表明它无法将 String 转换为 RegionEnum 并且我认为问题可能在 enum 并且它正在比较或其他方面,是否有显示 IN 表达式实现的链接? -
来自上一条评论:ClassCastException 显示在
for(RegionEnum r:regs)线上,我不明白为什么是字符串? regs 列表中有 Region -
您正在使用 from.join("regions").get("region")(...) 加入,但您的区域枚举没有名为 region 的属性。我目前无法验证这一点,但您能否尝试使用 'join("regions").in(regs)' 并告诉我会发生什么?
-
regions字段是Set<Region>,其中Region不是枚举,而是具有枚举字段region的实体类;它可能很复杂,我稍后会改变它;我解决了这个问题 - 从 jsf selectManyCheckbox 中,选定的项目被写入 List作为字符串,然后它们在标准中无法转换为 RegionEnum 类型。
标签: jpa join criteria-api