2010-10-25 18 views
40
problema

Estoy tratando de utilizar la API Criteria en mi nuevo proyecto:APP/Criterios API - Al igual que la igualdad y

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(); 
} 

Ahora cuando cambie esta línea:

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

a:

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

me sale un error diciendo:

El método como (expresión, expresión) en el CriteriaBuilder tipo no es> aplicable para los argumentos (Path, ParameterExpression)

Cuál es el problema?

Respuesta

66

Tal vez usted necesita

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

porque en primer lugar el argumento de like() es Expression<String>, no Expression<?> como en equal().

Otro enfoque es permitir la generación del metamodelo estática (ver documentos de su aplicación APP) y el uso de la API de seguridad de tipos Criterios:

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

(Tenga en cuenta que no se puede conseguir metamodelo estática de em.getMetamodel(), necesita para generarlo con herramientas externas).

+0

"nombre" aquí es el nombre de la variable del parámetro aquí? como: nombre en jpql? –

+0

@axtavt, cómo puedo ignorar el caso –

12

Mejor: predicado (no ParameterExpression), así:

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