2010-10-25 22 views
40

मैं अपने नए प्रोजेक्ट में मानदंड एपीआई का उपयोग करने की कोशिश कर रहा हूँ:जेपीए/मानदंड एपीआई - जैसा और बराबर समस्या

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

लिए:

जब मैं इस लाइन को बदलने

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

अब

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

मैं एक त्रुटि कह मिलती है:

विधि प्रकार CriteriaBuilder में (अभिव्यक्ति, अभिव्यक्ति) की तरह बहस के लिए लागू> नहीं है (, पथ ParameterExpression)

समस्या क्या है?

उत्तर

66

शायद आप

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

जरूरत है क्योंकि like() का पहला तर्क नहीं Expression<?>equal() में के रूप में Expression<String> है।

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

(ध्यान दें कि आप em.getMetamodel() से स्थिर मेटामॉडल नहीं मिल सकता है, आप की जरूरत:

एक और दृष्टिकोण स्थिर मेटामॉडल की पीढ़ी (अपने जेपीए कार्यान्वयन के डॉक्स देखें) को सक्षम और typesafe मानदंड एपीआई का उपयोग करने के लिए है बाहरी उपकरणों द्वारा इसे उत्पन्न करने के लिए)।

+0

"नाम" यहाँ पैरामीटर यहाँ से चर नाम है? जैसे: jpql में नाम? –

+0

@axtavt, मैं मामले को अनदेखा कैसे कर सकता हूं –

12

बेहतर: विधेय (नहीं ParameterExpression), इस तरह:

List<Predicate> predicates = new ArrayList<Predicate>(); 
if(reference!=null){ 
    Predicate condition = builder.like(root.<String>get("reference"),"%"+reference+"%"); 
    predicates.add(condition); 
} 
संबंधित मुद्दे