Jakarta ee 使用持久性API的criteriaQuery进行条件查询

Jakarta ee 使用持久性API的criteriaQuery进行条件查询,jakarta-ee,persistence,criteria-api,Jakarta Ee,Persistence,Criteria Api,会话bean的抽象方法findAll的默认生成代码如下: public List<T> findAll() { javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); cq.select(cq.from(entityClass)); return getEntityManager().createQuery(cq).

会话bean的抽象方法findAll的默认生成代码如下:

public List<T> findAll() {
    javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
    cq.select(cq.from(entityClass));
    return getEntityManager().createQuery(cq).getResultList();
}
公共列表findAll(){
javax.persistence.CriteriaQuery cq=getEntityManager().getCriteriaBuilder().createQuery();
cq.select(cq.from(entityClass));
返回getEntityManager().createQuery(cq.getResultList();
}
我们是否可以用同样的方法创建另一个方法,它可以找到所有记录,
WHERE status='1'

如何使用?

您需要使用cq.where()

CriteriaBuilder cb=getEntityManager().getCriteriaBuilder();
CriteriaQuery cq=cb.createQuery();
根c=cq.from(entityClass);
cq.选择(c);
cq.where(cb.gt(c.get(“状态”),1));
返回getEntityManager().createQuery(cq.getResultList();
您需要使用cq.where()

CriteriaBuilder cb=getEntityManager().getCriteriaBuilder();
CriteriaQuery cq=cb.createQuery();
根c=cq.from(entityClass);
cq.选择(c);
cq.where(cb.gt(c.get(“状态”),1));
返回getEntityManager().createQuery(cq.getResultList();

我最近也遇到了同样的问题,因此,尽管这可能与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使用函数gt()代替equal()测试其第一个参数是否大于第二个参数,这意味着参数必须是数字。但是,数据库中的status列显然是字符,因此会引发异常。此异常的含义是,没有将第一个参数作为char的gt()方法,尽管此方法与数值第一个参数一起存在


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

我最近也遇到了同样的问题,因此,尽管它可能与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使用函数gt()代替equal()测试其第一个参数是否大于第二个参数,这意味着参数必须是数字。但是,数据库中的status列显然是字符,因此会引发异常。此异常的含义是,没有将第一个参数作为char的gt()方法,尽管此方法与数值第一个参数一起存在


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

cq.where中给出错误(cb.gt(c.get(“status”),1)表示没有适合gt的方法。@mrN检查依赖项或导入。也许您导入了hibernate的CriteriaQuery,而不是JPAs。CriteriaQuery必须通过
javax.persistence.CriteriaQuery.CriteriaQuery导入。请查看问题中的代码,我使用了
javax.persistence.CriteriaQuery.CriteriaQuery
@mrN well。。。gt是代码中CriteriaBuilder-cb的方法。您确定要使用cb而不是cq吗?这是JPA是的,我是。是的,我已经实现了你的方法,并且所有的包都是正确的。在
cq.where(cb.gt(c.get(“status”),1)中给出错误表示没有适合gt的方法。@mrN检查依赖项或导入。也许您导入了hibernate的CriteriaQuery,而不是JPAs。CriteriaQuery必须通过
javax.persistence.CriteriaQuery.CriteriaQuery导入。请查看问题中的代码,我使用了
javax.persistence.CriteriaQuery.CriteriaQuery
@mrN well。。。gt是代码中CriteriaBuilder-cb的方法。您确定要使用cb而不是cq吗?这是JPA是的,我是。是的,我已经实施了你的方式,所有的包都是正确的。
cq.where(cb.equal(c.get("status"), 1));