2010-10-25 12 views
40

Sto cercando di utilizzare criteri di API nel mio nuovo progetto:JPA/Criteri API - Come & uguale problema

public List<Employee> findEmps(String name) { 
    CriteriaBuilder cb = em.getCriteriaBuilder(); 
    CriteriaQuery<Employee> c = cb.createQuery(Employee.class); 
    Root<Employee> emp = c.from(Employee.class); 
    c.select(emp); 
    c.distinct(emp); 
    List<Predicate> criteria = new ArrayList<Predicate>(); 

    if (name != null) { 
     ParameterExpression<String> 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<Employee> q = em.createQuery(c); 

    if (name != null) { 
     q.setParameter("name", name); 
    } 

    /* ... */ 

    return q.getResultList(); 
} 

Ora quando cambio questa linea:

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

a:

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

ottengo un errore che dice:

Il metodo come (Expression, espressione) nel tipo CriteriaBuilder non è> applicabile per gli argomenti (PATH, ParameterExpression)

Qual è il problema?

risposta

66

forse avete bisogno

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

perché primo argomento della like() è Expression<String>, non è Expression<?> come in equal().

Un altro approccio è quello di consentire la generazione del metamodello statica (vedi Documentazione della vostra implementazione JPA) e utilizzare typesafe Criteri API:

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

(Si noti che non è possibile ottenere metamodel statica da em.getMetamodel(), è necessario per generarlo con strumenti esterni).

+0

"nome" qui è il nome della variabile del parametro qui? come: nome in jpql? –

+0

@axtavt, come posso ignorare il caso –

12

Meglio: predicato (non ParameterExpression), in questo modo:

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