如何在CriteriaBuilder中编写此JPA选择语句
例如,这是基于电子邮件从数据库检索成员:如何在CriteriaBuilder中编写此JPA选择语句,jpa,jboss,jpa-2.0,Jpa,Jboss,Jpa 2.0,例如,这是基于电子邮件从数据库检索成员: CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<Member> criteria = cb.createQuery(Member.class); Root<Member> member = criteria.from(Member.class); criteria.select(member).where(cb
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Member> criteria = cb.createQuery(Member.class);
Root<Member> member = criteria.from(Member.class);
criteria.select(member).where(cb.equal(member.get("email"), email));
return em.createQuery(criteria).getSingleResult();
将where子句更改为如下所示
where(cb.equal(member.get("email"), email), cb.equal(member.get("password", password));
如果您计划支持具有可选值的多个条件,请将它们收集到一组谓词中,并使用
准则查询where(谓词…限制)代码>方法。
这样,您不仅可以在where子句中包含多个必需的条件过滤器,还可以忽略没有值的条件(例如,因为用户没有填写这些条件)。
范例
where(cb.equal(member.get("email"), email), cb.equal(member.get("password", password));
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Member> criteria = cb.createQuery(Member.class);
Root<Member> member = criteria.from(Member.class);
//create a holder for all conditions in `where` clause
List<Predicate> predicates = new ArrayList<>();
criteria.select(member).where(predicates.toArray(new Predicate[predicates.length()]));
//email is required
predicates.add(cb.equal(member.get("email"), email));
//password is required
predicates.add(cb.equal(member.get("password"), password));
//'status' is optional, only add it if it was not empty
if (status != null) {
predicates.add(cb.equal(member.get("status"), status));
}
return em.createQuery(criteria).getSingleResult();
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jpamodelgen</artifactId>
<scope>provided</scope>
</dependency>