2013-03-05 5 views
5

मैं हाइबरनेट 4 का उपयोग कर रहा हूं और मेरे पास खोज परिणाम प्राप्त करने के लिए जेएसएफ पृष्ठ में एक फ़िल्टर है। पैरामीटर मान [568,903] org.hibernate.ejb.AbstractQueryImpl पर उम्मीद प्रकार [java.lang.Long] से मेल नहीं खाती: खोज के निष्पादन के दौरान मैं निम्नलिखित अपवादहाइबरनेट पैरामीटर मान [568 9 03] अपेक्षित प्रकार से मेल नहीं खाता [java.lang.Long]

java.lang.IllegalArgumentException हो रही है। validateParameterBinding (AbstractQueryImpl.java:370) org.hibernate.ejb.AbstractQueryImpl.registerParameterBinding (AbstractQueryImpl.java:343) पर org.hibernate.ejb.QueryImpl.setParameter (QueryImpl.java:370) पर org.hibernate पर । ejb.QueryImpl.set पैरामीटर (QueryImpl.java:323)

नीचे मेरा कोड स्निपेट है, मैं इस समस्या को कैसे ठीक कर सकता हूं?

private Long projectNo; 

public Long getProjectNo() { 
    return projectNo; 
} 

public void setProjectNo(Long projectNo) { 
    this.projectNo = projectNo; 
} 

और मैं निम्नलिखित है डीएओ कक्षा में

String projectNo = filters.get("projectNo"); 
List<Predicate> criteria = new ArrayList<Predicate>(); 
    if (projectNo!= null) { 
    ParameterExpression<String> pexp = cb.parameter(String.class, "projectNo");    
    Predicate predicate = cb.equal(emp.get(Project_.projectNo), pexp); 
    criteria.add(predicate); 
} 
TypedQuery<Project> q = entityManager.createQuery(c); 
TypedQuery<Long> countquery = entityManager.createQuery(countQ); 
q.setParameter("projectNo", projectNo); // error in this line 
countquery.setParameter("projectNo", projectNo); 

संपादित करें 1

public void getProjects(ProjectQueryData data) { 

और ProjectQueryData कक्षा में, मैं निर्माता के रूप में निम्नलिखित है

public ProjectQueryData (int start, int end, String field, 
      QuerySortOrder order, Map<String, String> filters) { 

उत्तर

10

क्योंकि लगातार विशेषता प्रोजेक्ट का प्रकार Long है, पैरामीटर एक्स्प्रेशन बनाने के दौरान तर्क टाइप करें Long होना चाहिए।और इसके परिणामस्वरूप, क्योंकि है ParameterExpression के प्रकार Long, पैरामीटर का मान के प्रकार के लांग रूप में अच्छी तरह से किया जाना चाहिए:

//because this persistent Attribute is Long: 
private Long projectNo; 

//we use Long here as well 
ParameterExpression<Long> pexp = cb.parameter(Long.class, "projectNo"); 
... 
//and finally set parameter. Long again, because that is the type 
// type of ParameterExpression: 
query.setParameter("projectNo", Long.valueOf(projectNo)); 
+0

मिक्को, बहुत बहुत धन्यवाद, इसने वास्तव में समस्या को हल करने में मदद की है। बहुत सराहना की। – user75ponic

+1

+1 अच्छा काम, ऐसा लगता है कि आप काम करने वाले एक समेकित उत्तर के लिए सबकुछ एक साथ टुकड़े करने में सक्षम थे! –

2

projectNolong डीएओ में टाइप करें, इसलिए इसे long पर बदलें।

इस प्रयास करें:

q.setParameter("projectNo", new Long(projectNo)); 

मुझे लगता है कि आप बदलना चाहिए:

ParameterExpression<String> pexp = cb.parameter(Long.class, "projectNo"); 

ParameterExpression<String> pexp = cb.parameter(String.class, "projectNo"); 
+0

मैं इस की कोशिश की है, फिर भी एक ही समस्या बनी रहती है। – user75ponic

+0

आपको कौन सी त्रुटि मिल रही है – PSR

+0

निम्न त्रुटि 'java.lang.IllegalArgumentException: नामित पैरामीटर [projectNo] टाइप मिस्चैच; उम्मीद [java.lang.String] में पाया गया [java.lang.Long] ' – user75ponic

3

अपने डीएओ कक्षा में करने के लिए, आप projectNo एक स्ट्रिंग के रूप में हो रही है:

String projectNo = filters.get("projectNo"); 

हालांकि, आपके मॉडल वर्ग में, आप projectNo को लंबे समय तक परिभाषित कर रहे हैं।

आप इस लाइन पर अपने डीएओ में पैरामीटर सेट करते हैं:

q.setParameter("projectNo", projectNo); // error in this line 

आप एक स्ट्रिंग के रूप में पैरामीटर कर रहे हैं। उस लाइन को बदलने के रूप में इस का प्रयास करें (यह सोचते हैं कि आपने अशक्त जाँच projectNo):

q.setParameter("projectNo", Long.parseLong(projectNo)); 

यह भी शायद चोट नहीं होगा (रक्षात्मक प्रोग्रामिंग) सुनिश्चित करें कि projectNo पहले Long.parseLong बुला लिए संख्यात्मक है किया जाना है। आप इसे Apache Commons StringUtils.isNumeric के साथ कर सकते हैं।

+0

मैंने 'Long.parseLong' की कोशिश की है लेकिन मुझे एक ही त्रुटि मिल रही है। – user75ponic

संबंधित मुद्दे