JPA/Criteria API - Like & equal problem

匿名 (未验证) 提交于 2019-12-03 02:05:01

问题:

I'm trying to use Criteria API in my new project:

public List findEmps(String name) {     CriteriaBuilder cb = em.getCriteriaBuilder();     CriteriaQuery c = cb.createQuery(Employee.class);     Root emp = c.from(Employee.class);     c.select(emp);     c.distinct(emp);     List criteria = new ArrayList();      if (name != null) {         ParameterExpression p = cb.parameter(String.class, "name");         criteria.add(cb.equal(emp.get("name"), p));     }      /* ... */      if (criteria.size() == 0) {         throw new RuntimeException("no criteria");     } else if (criteria.size() == 1) {         c.where(criteria.get(0));     } else {         c.where(cb.and(criteria.toArray(new Predicate[0])));     }      TypedQuery q = em.createQuery(c);      if (name != null) {         q.setParameter("name", name);     }      /* ... */      return q.getResultList(); } 

Now when I change this line:

            criteria.add(cb.equal(emp.get("name"), p)); 

to:

            criteria.add(cb.like(emp.get("name"), p)); 

I get an error saying:

The method like(Expression, Expression) in the type CriteriaBuilder is not > applicable for the arguments (Path, ParameterExpression)

What's the problem?

回答1:

Perhaps you need

criteria.add(cb.like(emp.get("name"), p)); 

because first argument of like() is Expression, not Expression> as in equal().

Another approach is to enable generation of the static metamodel (see docs of your JPA implementation) and use typesafe Criteria API:

criteria.add(cb.like(emp.get(Employee_.name), p)); 

(Note that you can't get static metamodel from em.getMetamodel(), you need to generate it by external tools).



回答2:

Better: predicate (not ParameterExpression), like this :

List predicates = new ArrayList(); if(reference!=null){     Predicate condition = builder.like(root.get("reference"),"%"+reference+"%");     predicates.add(condition); } 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!