首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JPQL通过时JPA Criteria api查询失败

JPQL通过时JPA Criteria api查询失败
EN

Stack Overflow用户
提问于 2012-11-23 16:50:22
回答 1查看 170关注 0票数 0

我正在使用JPA来管理我的持久层。我的一个my Criteria API抛出了异常。我用JPQL重写了它,它工作得很好,所以我猜我的criteria api版本遗漏了一些东西。这就是我的criteria api查询:

代码语言:javascript
运行
复制
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);
}

工作正常的JPQL版本:

代码语言:javascript
运行
复制
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);
}

你能看出有什么不同吗?我是否在criteria api查询中放错了什么?

塔克恩斯!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-23 17:28:42

你可以试试下面的代码。我试着适应你的代码,你可以做相应的修改。

代码语言:javascript
运行
复制
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();

编辑:用于类型安全谓词定义的

代码语言:javascript
运行
复制
predicates.add(qb.equal(rule.get(Rule_.foodItemId), foodItemId));
predicates.add(qb.equal(rule.get(Rule_.ruleType), ruleType));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13525625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档