JPA Criteria api 使用 IN 表达式与连接
JPA Criteria api using IN expression with join
我有实体 Request
,实体 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;
}
}
我的标准正确吗?枚举有问题吗?或者标准不好?
我今天遇到了同样的异常,所以我试图解决这个问题。
假设我们已经初始化了以下实例(如您的示例所示):
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() 包装,它可能对你有用,因为它对我有用。
我有实体 Request
,实体 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;
}
}
我的标准正确吗?枚举有问题吗?或者标准不好?
我今天遇到了同样的异常,所以我试图解决这个问题。
假设我们已经初始化了以下实例(如您的示例所示):
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() 包装,它可能对你有用,因为它对我有用。