我的实体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;
}
}
是我的标准权利和枚举问题?或标准不好?
答案 0 :(得分:0)
我今天遇到了同样的例外,所以我试图解决这个问题。
假设我们已经初始化了以下实例(如您的示例所示):
CriteriaBuilder cb;
List<String> values;
Root<Entity> r; // where Entity has String name attribute
现在我们可以使用EclipseLink 2.6.2库以这种方式创建一个Predicate实例:
Predicate good = r.get("name").in(values);
但是如果我们尝试将谓词包装到需要“Expression&lt; Boolean&gt;”的 cb.isTrue()方法(正如你所做的那样)中像这样的参数:
Predicate wrong = cb.isTrue(r.get("name").in(values));
所提到的异常 PREDICATE_PASSED_TO_EVALUATION 将在您收到它时引发,即使表达式具有正确的语法。
我认为因为Expression是Predicate类的祖先,但这只是一个想法。至少异常消息说的是这样的。
所以只需删除 cb.isTrue()包装,它可能会对你有用,因为它适用于我。