JPA / Criteria API – Comme & égal problème

J’essaie d’utiliser l’API Criteria dans mon nouveau projet:

public List findEmps(Ssortingng 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(Ssortingng.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(); } 

Maintenant, quand je change cette ligne:

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

à:

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

J’ai une erreur en disant:

La méthode comme (Expression, Expression) dans le type CriteriaBuilder n’est pas applicable pour les arguments (Path, ParameterExpression)

Quel est le problème?

Peut-être vous avez besoin

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

car le premier argument de like() est Expression , pas Expression comme étant equal() .

Une autre approche consiste à activer la génération du métamodèle statique (voir la documentation de votre implémentation JPA) et à utiliser l’API Critères type:

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

(Notez que vous ne pouvez pas obtenir de métamodèle statique depuis em.getMetamodel() , vous devez le générer avec des outils externes).

Mieux: prédicat (pas ParameterExpression ), comme ceci:

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