2010-10-25 41 views
40

Tôi đang cố gắng sử dụng Tiêu chuẩn API trong dự án mới của tôi:JPA/Tiêu chuẩn API - Giống như & vấn đề bình đẳng

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

Bây giờ khi tôi thay đổi dòng này:

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

tới:

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

Tôi gặp lỗi khi nói:

Phương pháp tương tự (Expression, Expression) trong các loại CriteriaBuilder không phải là> áp dụng cho các đối số (Path, ParameterExpression)

vấn đề là gì?

Trả lời

66

Có lẽ bạn cần

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

vì đối số đầu tiên của like()Expression<String>, không Expression<?> như trong equal().

cách tiếp cận khác là cho phép thế hệ của metamodel tĩnh (xem tài liệu thực hiện JPA) và sử dụng typesafe API Tiêu chí:

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

(Lưu ý rằng bạn không thể có được metamodel tĩnh từ em.getMetamodel(), bạn cần để tạo ra nó bằng các công cụ bên ngoài).

+0

"tên" ở đây là tên biến của tham số ở đây? như: tên trong jpql? –

+0

@axtavt, cách tôi có thể bỏ qua trường hợp –

12

tốt hơn: vị ngữ (không ParameterExpression), như thế này:

List<Predicate> predicates = new ArrayList<Predicate>(); 
if(reference!=null){ 
    Predicate condition = builder.like(root.<String>get("reference"),"%"+reference+"%"); 
    predicates.add(condition); 
} 
Các vấn đề liên quan