JPA Criteria api 使用 IN 表达式与连接

JPA Criteria api using IN expression with join

我有实体 Request,实体 Request@ManyToMany Set<Region> regionsRegion 实体有字段 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;
}

}

我的标准正确吗?枚举有问题吗?或者标准不好?

我今天遇到了同样的异常,所以我试图解决这个问题。

假设我们已经初始化了以下实例(如您的示例所示):

CriteriaBuilder cb;
List<String> values;
Root<Entity> r; // where Entity has String name attribute

现在我们可以使用 EclipseLink 2.6.2 库以这种方式创建谓词实例

Predicate good = r.get("name").in(values);

但是如果我们尝试将谓词包装到 cb.isTrue() 方法 中(正如您所做的)需要这样的 "Expression<Boolean>" 参数:

Predicate wrong = cb.isTrue(r.get("name").in(values));

提到的异常 PREDICATE_PASSED_TO_EVALUATION 将在您收到它时引发,即使表达式具有正确的语法。

我认为是因为表达式是谓词的祖先 class 但这只是一个想法。至少异常消息是这样说的。

所以 只需删除 cb.isTrue() 包装,它可能对你有用,因为它对我有用。