Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA条件api查询在JPQL运行时失败_Jpa_Jpa 2.0_Jpql_Criteria Api - Fatal编程技术网

JPA条件api查询在JPQL运行时失败

JPA条件api查询在JPQL运行时失败,jpa,jpa-2.0,jpql,criteria-api,Jpa,Jpa 2.0,Jpql,Criteria Api,我正在使用JPA来管理我的持久层。 我的一个标准API抛出了一个异常。我在JPQL中重新编写了它,它工作得很好,所以我想我在CriteriaAPI版本中遗漏了一些东西。 这是我的标准api查询: public FoodItemTagsOverrideRule findByFoodItemIdAndType(long foodItemId, RuleTypes ruleType) { CriteriaQuery<Rule> c = getCriteriaQuery(); Root&

我正在使用JPA来管理我的持久层。 我的一个标准API抛出了一个异常。我在JPQL中重新编写了它,它工作得很好,所以我想我在CriteriaAPI版本中遗漏了一些东西。 这是我的标准api查询:

public FoodItemTagsOverrideRule findByFoodItemIdAndType(long foodItemId, RuleTypes ruleType) {
 CriteriaQuery<Rule> c = getCriteriaQuery();
 Root<Rule> rule =
 c.from(Rule.class);
 Predicate foodItemIdCondition =
 cb.equal(rule.get(Rule_.foodItemId), foodItemId);
 Predicate typeCondition =
 cb.equal(rule.get(Rule_.ruleType),
 ruleType.toString());
 c.where(foodItemIdCondition, typeCondition);

 TypedQuery<Rule> q =
 entityManager.createQuery(c);
 List<Rule> result = q.getResultList();
 if (result.isEmpty()) {
 return null;
 }
 return result.get(0);
}
public fooditemtagsgoverrideerule findByFoodItemIdAndType(长foodItemId,规则类型ruleType){
CriteriaQuery c=getCriteriaQuery();
根规则=
c、 来自(规则类);
谓词条件=
cb.equal(rule.get(rule.foodItemId),foodItemId);
谓词类型条件=
cb.equal(rule.get(rule_u.ruleType)),
ruleType.toString());
c、 式中(食品条件、类型条件);
类型查询q=
entityManager.createQuery(c);
List result=q.getResultList();
if(result.isEmpty()){
返回null;
}
返回结果get(0);
}
工作正常的JPQL版本:

public Rule findByFoodItemIdAndType(long foodItemId, RuleTypes ruleType) {
    TypedQuery<Rule> query = getEntityManager().createQuery(
        "SELECT rule " + "FROM " + Rule.class.getSimpleName() + " rule " + "WHERE rule.foodItemId = :foodItemId "
        + "AND rule.ruleType = :ruleType", Rule.class);

query.setParameter("foodItemId", foodItemId);
query.setParameter("ruleType", ruleType.toString());

List<Rule> result = query.getResultList();

if (result.isEmpty()) {
    return null;
}
return result.get(0);
}
公共规则FindByFoodItemId和类型(长foodItemId,规则类型ruleType){
TypedQuery query=getEntityManager().createQuery(
从“+rule.class.getSimpleName()+”规则“+”中选择规则“+”,其中rule.foodItemId=:foodItemId
+“AND rule.ruleType=:ruleType”,rule.class);
setParameter(“foodItemId”,foodItemId);
query.setParameter(“ruleType”,ruleType.toString());
List result=query.getResultList();
if(result.isEmpty()){
返回null;
}
返回结果get(0);
}
你能看出有什么不同吗?我是否在criteria api查询中出错


萨克斯

您可以尝试下面的代码。我试图适应你的代码,你可以相应地修改

CriteriaBuilder qb = em.getCriteriaBuilder();
CriteriaQuery cq = qb.createQuery();
Root<Rule> rule = cq.from(Rule.class);

List<Predicate> predicates = new ArrayList<Predicate>();

predicates.add(qb.equal(rule.get("foodItemId"), foodItemId));
predicates.add(qb.equal(rule.get("ruleType"), ruleType));

cq.select(rule).where(predicates.toArray(new Predicate[]{}));
em.createQuery(cq).getResultList();

谢谢你。我真的看不出有什么区别,但我会试一试。我无法解释,但这似乎很好。我没有使用谓词定义,因为它们不是类型安全的,但将它们放在数组中解决了这个问题。谢谢
predicates.add(qb.equal(rule.get(Rule_.foodItemId), foodItemId));
predicates.add(qb.equal(rule.get(Rule_.ruleType), ruleType));