2012-07-18 12 views
5

मूल रूप से, मेरे सवाल का इस एक के रूप में ही है, लेकिन के लिए जावा के (JBoss) हाइबरनेट: How can we order a column as int using hibernate criteria API?Convert स्ट्रिंग हाइबरनेट आदेश कसौटी में int करने के लिए

मैं एक स्ट्रिंग से int करने के लिए एक कलाकारों के साथ एक आदेश प्रतिबंध बनाना चाहते हैं स्तंभ। कुछ

criteria.addOrder(Order.asc("cast(id as int)")); 

अपवाद "संपत्ति को हल नहीं कर सका: [वर्ग] के int (आईडी के रूप में)"। मैंने int और integer के साथ दोनों कास्ट (ए) और कन्वर्ट (,) को आजमाया है।

उत्तर

14

विषय के बावजूद पुराना है और समस्या हल हो सकती है, मैं समाधान पोस्ट करूंगा। शायद यह किसी के लिए भविष्य में सहायक होगा।

criteria.addOrder(new org.hibernate.criterion.Order("anystring", true) { 
      @Override 
      public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException { 
       return "cast(id as int)"; 
      } 
     }); 
+1

यह समाधान काम करता है यदि आप आरोही या अवरोही निर्दिष्ट नहीं करना चाहते हैं, क्योंकि दूसरा पैरामीटर मूल में स्केलस्ट्रिंग विधि में उपयोग किया जाता है। यदि आप इसे ओवरराइड करते हैं तो आपको स्ट्रिंग के अंत में एसी या desc जोड़ना होगा। – KarolR

+1

करोलआर, यही कारण है कि विधि को एसक्लस्ट्रिंग को बुलाया जाता है। आप अपनी इच्छानुसार अपना ऑर्डर लिख सकते हैं, लेकिन आपको पूरे ऑर्डर स्ट्रिंग को निर्दिष्ट करना चाहिए। और एक और - ऑर्डर के लिए हमेशा दिशा होती है, डिफ़ॉल्ट रूप से "एसी" का उपयोग किया जाता है, इसलिए "कास्ट (आईडी के रूप में आईडी)" वास्तव में "कास्ट (आईडी के रूप में आईडी) एसी" है, लेकिन आप इसे छोड़ सकते हैं। आप जटिल क्रम निर्दिष्ट कर सकते हैं, कैसे हाइबरनेट को तय करना चाहिए कि दिशा कहां रखना है, जिसे पैरामीटर के रूप में निर्दिष्ट किया गया था? – yorlin

+0

यह वास्तव में बहुत उपयोगी है और आपने मुझे ऑर्डर इश्यू के लिए एसक्यूएल के रूप में अपने मानदंड कोड को दोबारा करने के लिए बहुत समय व्यतीत करने से बचाया है। आपकी टिप्पणियों और उत्तर दोनों के लिए +1। – nihirus

3

यदि कॉलम में पूर्णांक मान होते हैं, तो सबसे अच्छा समाधान स्ट्रिंग के बजाए इसे पूर्णांक के रूप में मैप करना है।

यदि अस्पष्ट कारणों से, यह संभव नहीं है, तो आप इस क्षेत्र पर अपनी इकाई और क्रम में @Formula("cast(id) as number") के साथ एनोटेटेड एक पूर्णांक फ़ील्ड जोड़ सकते हैं।

+0

कारण सामान्य कॉल और स्ट्रिंग पहचानकर्ता के साथ कुछ तालिकाओं होने, यह स्ट्रिंग के लिए सब कुछ परिवर्तित करने के लिए निर्णय लिया गया। वैसे भी, मैं मेवेन बिल्ड (हाइबरनेट 3-मेवेन-प्लगइन में) में त्रुटि अपवादों के कारण फॉर्मूला एनोटेशन का उपयोग करने में सक्षम नहीं हूं, इसलिए मैं इसका परीक्षण नहीं कर सकता और मैं इस मुद्दे को स्टैंड-बाय पर छोड़ दूंगा । TKS – spnbldk

+1

यह '@Formula (" कास्ट (आईडी के रूप में आईडी (10,0)) होना चाहिए ") ' – jtomaszk

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