【问题标题】:Using criteriaQuery of Persistence API to query conditionally使用 Persistence API 的 criteriaQuery 进行条件查询
【发布时间】:2012-07-05 10:46:49
【问题描述】:

Session bean的抽象方法findAll的默认生成代码是这样的:

public List<T> findAll() {
    javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
    cq.select(cq.from(entityClass));
    return getEntityManager().createQuery(cq).getResultList();
}

我们能不能用同样的方法创建另一个方法,可以找到所有记录,WHERE status ='1'

怎么做?

【问题讨论】:

    标签: jakarta-ee persistence criteria-api


    【解决方案1】:

    你需要使用 cq.where()

    CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
    CriteriaQuery cq = cb.createQuery();
    Root<T> c = cq.from(entityClass);
    cq.select(c);
    cq.where(cb.gt(c.get("status"), 1));
    return getEntityManager().createQuery(cq).getResultList();
    

    【讨论】:

    • Give error in cq.where(cb.gt(c.get("status"), 1)); 说没有适合 gt 的方法。
    • @mrN 检查依赖项或导入。也许你导入的是休眠的 CriteriaQuery,而不是 JPA。 CriteriaQuery 必须由javax.persistence.criteria.CriteriaQuery导入
    • 请看问题中的代码,我用过javax.persistence.criteria.CriteriaQuery
    • @mrN well... gt 是 CriteriaBuilder 的方法 - 代码中的 cb。你确定用cb而不是cq吗?这里是 JPA CriteriaBuilder reference
    • 是的,我是。是的,我已经实现了你的方式,所有的包都是正确的。
    【解决方案2】:

    我最近遇到了同样的问题,所以,虽然它可能与 OP 不再相关,但我会发布一个答案。也许它可以帮助其他人。

    CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
    CriteriaQuery cq = cb.createQuery();
    Root<T> c = cq.from(entityClass);
    cq.select(c);
    cq.where(cb.equal(c.get("status"), 1));
    return getEntityManager().createQuery(cq).getResultList();
    

    如您所见,与@dgregory 的答案的唯一区别在于这一行:

    cq.where(cb.equal(c.get("status"), 1));
    

    @dgregory 使用的函数 gt() 而不是 equal() 测试其第一个参数是否大于第二个参数,这意味着参数必须是数字。但是,您数据库中的 status 列显然是一个 char,因此会抛出异常。这个异常的意思是不存在第一个参数为char的gt()方法,虽然这个方法存在第一个参数为数字。

    更不用说,即使存在这样的方法,这也不是您对查询的期望。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-14
      • 1970-01-01
      • 2020-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多