JPA Criteria api使用IN表达式和join

时间:2015-02-05 05:54:36

标签: jpa join criteria-api

我的实体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;
}

}

是我的标准权利和枚举问题?或标准不好?

1 个答案:

答案 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()包装,它可能会对你有用,因为它适用于我。