दिलचस्प पोस्ट
कैसे MATLAB में कक्षा की एक सरणी preallocate करने के लिए? जावा में मौजूदा फाइल सामग्री को संशोधित करना ब्राउज़र में पीएनजी पारदर्शिता का काम कैसे प्राप्त करें, जो कि इसका समर्थन नहीं करते हैं? पायथन से सी / सी ++ कॉलिंग? गिट के साथ एक विशिष्ट टैग डाउनलोड करें ASP.NET MVC – नियंत्रक से App_Data फ़ोल्डर के लिए पूर्ण पथ खोजें मुझे सुपर को कब कॉल करना चाहिए? जावा थ्रेड इंटरप्ट () विधि कहां बुला रही है अगर मैं नहीं हूं? ज़िप फ़ाइल बनाएं: त्रुटि रनिंग कमांड "" का स्थिति 127 है एंड्रॉइड – कस्टम शैली में निर्दिष्ट मार्जिन प्रभाव नहीं लेते कोणीय जेएस और गूगल एपीआई client.js (गैपसी) मैं कैसे जान सकता हूँ कि कोई प्रक्रिया चल रही है? Git कमांड मैक टर्मिनल में काम नहीं कर रहा है: "dyld: प्रतीक नहीं मिला: ___स्ट्रलसीपी_च्क" त्रुटि जावा डिफ़ॉल्ट स्टैक आकार MySQL कार्यक्षेत्र: कनेक्शन को कैसे जीवित रखना है I

कैसे हाइबरनेट HQL परिणामों के साथ प्रकार सुरक्षा चेतावनियों से बचने के लिए?

उदाहरण के लिए मेरे पास ऐसी क्वेरी है:

Query q = sess.createQuery("from Cat cat"); List cats = q.list(); 

अगर मैं इस तरह से कुछ करने की कोशिश करता हूं तो यह चेतावनी दिखाएगा "प्रकार सुरक्षा: प्रकार सूची की अभिव्यक्ति सूची के अनुरूप होने के लिए अनचेक रूपांतरण की आवश्यकता है":

 List<Cat> cats = q.list(); 

क्या इससे बचने का कोई तरीका है?

Solutions Collecting From Web of "कैसे हाइबरनेट HQL परिणामों के साथ प्रकार सुरक्षा चेतावनियों से बचने के लिए?"

जैसा कि सुझाव दिया गया है, हर जगह @SuppressWarnings का उपयोग करना, यह करने का एक अच्छा तरीका है, हालांकि हर बार जब आप q.list() कॉल करते हैं तो इसमें थोड़ा सा उंगली टाइपिंग शामिल होती है।

मुझे लगता है कि तीन अन्य तकनीकें हैं:

Collections.checkedList()

इस के साथ अपने असाइनमेंट को बदलें:

 List<Cat> cats = Collections.checkedList(q.list(), Cat.class); 

आप उस विधि के लिए जवादाक की जांच करना चाह सकते हैं, खासकर equals और hashCode संबंध में

एक कलाकार-सहायक लिखें

बस अपने सभी @SuppressWarnings को एक जगह पर रिफैक्टर करें:

 List<Cat> cats = MyHibernateUtils.listAndCast(q); ... public static <T> List<T> listAndCast(Query q) { @SuppressWarnings("unchecked") List list = q.list(); return list; } 

ईलिपस को अपरिहार्य समस्याओं के लिए चेतावनी उत्पन्न करने से रोकें

एक्लिप्स में, विंडो> वरीयताएँ> जावा> कंपाइलर> त्रुटियाँ / चेतावनियाँ पर जाएं और सामान्य प्रकार के अंतर्गत, चेकबॉक्स का चयन करें Ignore unavoidable generic type problems due to raw APIs

इससे ऐसी समस्याओं के लिए अनावश्यक चेतावनियां बंद हो जाएंगी जैसे कि ऊपर वर्णित एक अपरिहार्य है।

कुछ टिप्पणियां:

  • मैंने q.list() के परिणाम के बजाय Query में पास करना चुना क्योंकि इस तरह से "धोखा" विधि केवल सीतनिद्रा में होना के साथ धोखा देने के लिए इस्तेमाल की जा सकती है, और आमतौर पर किसी भी List को धोखा देने के लिए नहीं।
  • आप के लिए इसी तरह के तरीकों को जोड़ सकते हैं।

हम @SuppressWarnings("unchecked") भी उपयोग करते हैं, लेकिन हम इसे केवल वेरिएबल की घोषणा पर उपयोग करने का प्रयास करते हैं, संपूर्ण विधि पर नहीं:

 public List<Cat> findAll() { Query q = sess.createQuery("from Cat cat"); @SuppressWarnings("unchecked") List<Cat> cats = q.list(); return cats; } 

प्रश्न पूछने के बाद से यह एक लंबा समय रहा है, लेकिन मुझे उम्मीद है कि मेरा जवाब मेरे जैसे किसी के लिए सहायक हो सकता है

अगर आप javax.preistence api डॉक्स पर एक नज़र डालेंगे, तो आप देखेंगे कि Java Persistence 2.0 बाद से कुछ नए तरीके जोड़े गए हैं। उनमें से एक createQuery(String, Class<T>) जो देता है TypedQuery<T> आप टाइप टाइप किए जा सकते हैं, जैसे कि आपने उस छोटे अंतर के साथ Query किया था कि सभी ऑपरेशन अब सुरक्षित हैं

तो, बस इस तरह से अपने कोड को बदले:

 Query q = sess.createQuery("from Cat cat", Cat.class); List<Cat> cats = q.list(); 

और तुम सब तैयार हो।

हमारे कोड में हम कॉलिंग विधियों को इनकी व्याख्या करते हैं:

@SuppressWarnings ( "अनियंत्रित")

मुझे पता है कि यह एक हैक की तरह लगता है, लेकिन एक सह-विकासकर्ता ने हाल ही में जांच की और पाया कि यह सब हम कर सकते थे।

जाहिर है, हाइबरनेट एपीआई में query.list () विधि "डिजाइन द्वारा सुरक्षित" प्रकार नहीं है, और इसे बदलने की कोई योजना नहीं है ।

मेरा मानना ​​है कि कंपाइलर चेतावनियों से बचने के लिए सबसे सरल समाधान वास्तव में @SuppressWarnings ("अनचेक") जोड़ना है। इस एनोटेशन को विधि स्तर पर रखा जा सकता है या, यदि किसी विधि के अंदर, एक चर घोषणा से पहले।

यदि आपके पास एक ऐसी विधि है, जिसमें query.list () और एन्क्रिप्ट करता है, तो सूची (या संग्रह) देता है, आपको एक चेतावनी भी मिलती है। लेकिन यह एक @SuppressWarnings ("कच्चा प्रकार") का उपयोग कर दबाया जाता है।

सूची और क्रैस्ट (क्वेरी) मैट किके द्वारा प्रस्तावित विधि Query.list () से कम लचीला है। जबकि मैं कर सकता हूँ:

 Query q = sess.createQuery("from Cat cat"); ArrayList cats = q.list(); 

अगर मैं नीचे कोड का प्रयास करता हूं:

 Query q = sess.createQuery("from Cat cat"); ArrayList<Cat> cats = MyHibernateUtils.listAndCast(q); 

मुझे एक संकलन त्रुटि मिलती है: प्रकार बेमेल: सूची से अर्रे सूची में परिवर्तित नहीं किया जा सकता

यह एक निरीक्षण या गलती नहीं है चेतावनी एक वास्तविक अंतर्निहित समस्या को दर्शाती है – कोई रास्ता नहीं है कि जावा कंपाइलर वास्तव में यह सुनिश्चित कर सकता है कि हाइबरनेट क्लास यह काम ठीक से करने वाला है और यह सूची में केवल बिल्लियां शामिल होगी यहां दिए गए सुझावों में से कोई भी ठीक है।

Query बजाय TypedQuery का प्रयोग करने का प्रयास करें इसके बदले उदाहरण के लिए: –

 Query q = sess.createQuery("from Cat cat", Cat.class); List<Cat> cats = q.list(); 

इसे इस्तेमाल करो:-

 TypedQuery<Cat> q1 = sess.createQuery("from Cat cat", Cat.class); List<Cat> cats = q1.list(); 

नहीं, लेकिन आप इसे विशिष्ट क्वेरी विधियों में अलग कर सकते हैं और @SuppressWarnings("unchecked") टिप्पणी के साथ चेतावनियों को दबा सकते हैं।

हमें एक ही समस्या थी लेकिन यह हमारे लिए एक बड़ा सौदा नहीं था क्योंकि हमें हाइबरनेट क्वेरी और सत्र के साथ अन्य प्रमुख मुद्दों को हल करना था।

विशेष रूप से:

  1. नियंत्रण जब एक लेनदेन किया जा सकता है। (हम यह गणना करना चाहते थे कि टीएक्स कितनी बार "शुरू" किया गया था और केवल जब टीएक्स को "समाप्त" किया गया था उसी समय की शुरुआत की गई थी। कोड के लिए उपयोगी है जो पता नहीं है कि उसे लेनदेन शुरू करने की आवश्यकता है। किसी भी कोड के लिए एक TX की आवश्यकता होती है, केवल एक "शुरू" और समाप्त होने पर इसे समाप्त होता है।)
  2. प्रदर्शन मेट्रिक्स एकत्र करना
  3. जब तक यह ज्ञात नहीं होता कि कुछ वास्तव में किया जाएगा तब तक लेनदेन शुरू करने में देरी हो रही है।
  4. Query.uniqueResult () के लिए अधिक कोमल व्यवहार

तो हमारे लिए, हमारे पास:

  1. एक इंटरफ़ेस बनाएं (एम्प्लाफ़ाइफी) जो प्रश्न विस्तृत करता है
  2. एक क्लास बनाएं (एम्प्लाफीआईआईआईपीएलएल) जो एम्प्लाफिफाइनी प्रदान करता है और एक org.hibernate को लपेटता है।
  3. एक Txmanager बनाएँ जो एक TX देता है
  4. टीएक्स में विभिन्न रचनात्मकता विधियां हैं और AmplafiQueryImpl लौटे हैं

और अंत में,

AmplafiQuery में एक "asList ()" है, जो कि query.list () के एक सामान्य सक्षम संस्करण है AmplafiQuery में एक "अनन्य ()" है जो क्वेरी का एक सामान्य सक्षम संस्करण है। अनिकरिसल्ट () (और बस एक फेंकने के बजाय एक समस्या का लॉग करता है अपवाद)

यह @SuppressWarnings से बचने के लिए बहुत काम है हालांकि, जैसे मैंने कहा (और सूचीबद्ध) बहुत सारे अन्य बेहतर हैं! रैपिंग काम करने के लिए कारण

जो डीन का हल दिलचस्प दिखता है, लेकिन क्या आपको लगता है कि इसके लायक है – चेतावनी से छुटकारा पाने के लिए सभी तत्वों के माध्यम से एक नई सूची और पाश बनाएं?

(क्षमा करें, किसी कारण के लिए सीधे उनके समाधान में कोई टिप्पणी नहीं जोड़ सकते हैं)

मुझे पता है कि यह पुराना है, लेकिन मैट किउल्स उत्तर में आज के नोट के लिए 2 अंक हैं।

प्वाइंट 1

इस

 List<Cat> cats = Collections.checkedList(Cat.class, q.list()); 

यह होना चाहिए

 List<Cat> cats = Collections.checkedList(q.list(), Cat.class); 

प्वाइंट 2

इस से

 List list = q.list(); 

इसके लिए

 List<T> list = q.list(); 

मूल चेतावनी टैग मार्करों में स्पष्ट रूप से अन्य चेतावनियों को कम करना ब्राउज़र द्वारा छीन लिया गया था।

इसे इस्तेमाल करे:

 Query q = sess.createQuery("from Cat cat"); List<?> results = q.list(); for (Object obj : results) { Cat cat = (Cat) obj; } 

हाइबरनेट क्वेरी के साथ प्रकार सुरक्षा चेतावनियों से बचने का एक अच्छा समाधान है टारपीडोक्लाइज जैसी टूल का उपयोग करने के लिए आपको टाइप सुरक्षित एचकएलएल बनाने में मदद करने के लिए

 Cat cat = from(Cat.class); org.torpedoquery.jpa.Query<Entity> select = select(cat); List<Cat> cats = select.list(entityManager); 

यदि आप @SuppressWarnings ("अनचेक") का उपयोग नहीं करना चाहते हैं, तो आप निम्न कार्य कर सकते हैं।

  Query q = sess.createQuery("from Cat cat"); List<?> results =(List<?>) q.list(); List<Cat> cats = new ArrayList<Cat>(); for(Object result:results) { Cat cat = (Cat) result; cats.add(cat); } 

एफवाईआई – मैंने एक यूज पद्धति बनाई है, जो मेरे लिए यह करती है, इसलिए यह मेरे कोड को कूड़ा नहीं देती और मुझे @ सरसवर्ड वार्निंग का उपयोग करने की ज़रूरत नहीं है