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'
如何?
答案 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();
}