使用persistence API的criteriaQuery来有条件地进行查询

时间:2012-07-05 03:05:20

标签: java-ee persistence criteria-api

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'

如何?

3 个答案:

答案 0 :(得分:4)

您需要使用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();

答案 1 :(得分:0)

我最近遇到了同样的问题,所以,虽然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 ,因此抛出异常。这个例外的含义是没有gt()方法将第一个参数作为char,尽管此方法与数字第一个参数一起存在。

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

答案 2 :(得分:-1)

public List findWithName(String name) { 
    return em.createQuery("SELECT c FROM Customer c WHERE c.name LIKE :custName")
        .setParameter("custName", name)
        .setMaxResults(10)
        .getResultList();
}