दिलचस्प पोस्ट
केवल बिटwise ऑपरेटरों का उपयोग करके दो पूर्णांक जोड़ें? NSDate का उपयोग सप्ताह के दिन प्राप्त करें मैं इंटरनेट एक्सप्लोरर में कंसोल लॉगिंग का उपयोग कैसे कर सकता हूं? निर्भरता के साथ एक जार बनाने के लिए Gradle का उपयोग करना टाइमआउट डब्ल्यूसीएफ सेवाएं जावास्क्रिप्ट के द्वारा सीएसएस छद्म-तत्व शैलियों को बदलना सतह के पुनर्निर्माण के लिए 3 डी बिंदु बादल से मजबूत एल्गोरिथ्म? "अनुपलब्ध डेटा" संरक्षण के लिए क्लाइंट / जेएस फ्रेमवर्क? एचटीएमएल 5 वीडियो टैग के साथ स्थानीय (हार्ड ड्राइव) वीडियो फाइल खेलें? MySQL – चयन पर पंक्ति नंबर प्राप्त करें जावास्क्रिप्ट में 2 डी-सरणी को स्थानांतरित करना PHP घातक त्रुटि: अपरिभाषित फ़ंक्शन को कॉल करें mssql_connect () जावा में स्ट्रिपिंग एचटीएमएल टैग एंड्रॉइड एनडीके: एक प्री-कंपाइल किए गए स्थैतिक लाइब्रेरी का उपयोग करके लिंक गतिशील प्रोग्रामिंग का उपयोग करते हुए सबसे लंबे समय तक बढ़ते हुए बदलाव का निर्धारण कैसे करें?

केंद्रीय विकल्प हाइबरनेट

सीतनिद्रा में होना का उपयोग कर एक यूनियन क्वेरी को कैसे लागू करना है? मुझे पता है कि सीतनिद्रा में होना इस समय यूनियन पूछताछ का समर्थन नहीं करता है, अभी एकमात्र तरीका है कि मैं एक संघ बनाने के लिए देख रहा हूं एक दृश्य तालिका का उपयोग करना है

दूसरा विकल्प सादे जेडीबीसी का उपयोग करना है, लेकिन इस तरह से मैं अपने सारे उदाहरण / मानदंडों को गुलदस्ते खो देता हूं, साथ ही सीतनिद्रा में होना मैपिंग सत्यापन जो हाइबरनेट तालिका / स्तंभों के खिलाफ करता है

वेब के समाधान से एकत्रित समाधान "केंद्रीय विकल्प हाइबरनेट"

VIEW का उपयोग करें एक ही वर्ग को इकाई नाम का उपयोग करते हुए विभिन्न तालिकाओं / दृश्यों पर मैप किया जा सकता है, इसलिए आपके पास बहुत अधिक दोहराव नहीं होगा। वहां होने के कारण, ठीक है, ठीक काम करता है।

सादे जेडीबीसी की एक और छिपी हुई समस्या है: यह सीतनिद्रा में होना सत्र कैश से अनजान है, इसलिए यदि कुछ लेनदेन के अंत तक कैश किया गया हो और सीतनिद्रा में होना सत्र से फ्लाई नहीं किया गया, तो जेडीबीसी क्वेरी इसे नहीं खोज पाएगा। कभी-कभी बहुत ही चकित हो सकता है

आप id in (select id from ...) or id in (select id from ...) उपयोग कर सकते हैं id in (select id from ...) or id in (select id from ...)

उदाहरण के लिए गैर-काम की बजाय

 from Person p where p.name="Joe" union from Person p join p.children c where c.name="Joe" 

तुम यह कर सकते थे

 from Person p where p.id in (select p1.id from Person p1 where p1.name="Joe") or p.id in (select p2.id from Person p2 join p2.children c where c.name="Joe"); 

कम से कम MySQL का उपयोग करते हुए, आप बाद में इसके साथ प्रदर्शन समस्याओं में भाग लेंगे, हालांकि। यह कभी-कभी आसान होता है कि किसी गरीब व्यक्ति के बजाय दो प्रश्नों में शामिल हों:

 // use set for uniqueness Set<Person> people = new HashSet<Person>((List<Person>) query1.list()); people.addAll((List<Person>) query2.list()); return new ArrayList<Person>(people); 

एक जटिल एक की तुलना में दो सामान्य प्रश्नों को करना अक्सर बेहतर होता है

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

एक उदाहरण देने के लिए, उप-चयन समाधान से परिणामी MySQL क्वेरी का एक्सप्लेन आउटपुट है:

 mysql> explain select p.* from PERSON p where p.id in (select p1.id from PERSON p1 where p1.name = "Joe") or p.id in (select p2.id from PERSON p2 join CHILDREN c on p2.id = c.parent where c.name="Joe") \G *************************** 1. row *************************** id: 1 select_type: PRIMARY table: a type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 247554 Extra: Using where *************************** 2. row *************************** id: 3 select_type: DEPENDENT SUBQUERY table: NULL type: NULL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: NULL Extra: Impossible WHERE noticed after reading const tables *************************** 3. row *************************** id: 2 select_type: DEPENDENT SUBQUERY table: a1 type: unique_subquery possible_keys: PRIMARY,name,sortname key: PRIMARY key_len: 4 ref: func rows: 1 Extra: Using where 3 rows in set (0.00 sec) 

सबसे महत्वपूर्ण बात, 1. पंक्ति किसी भी सूचकांक का उपयोग नहीं करता है और 200k + पंक्तियों को मानता है। खराब! इस प्रश्न के निष्पादन में 0.7 के बराबर था, दोनों subqueries मिलीसेकंड में हैं।

मुझे व्लादिमीर से सहमत होना होगा मैं भी HQL में यूनियन का उपयोग कर देखा था और इसके चारों ओर कोई रास्ता नहीं मिला। अजीब बात यह थी कि मैं हाइबरनेट में पूछताछ कर सकता हूं कि यूनियन असमर्थित है, यूनियन से जुड़ी बग रिपोर्ट 'तय', लोगों के न्यूजग्रुप ने कहा है कि बयान यूनियन में कम कर दिए जाएंगे, और लोगों के अन्य समाचार समूहों की रिपोर्ट करने पर यह काम करता है ठीक है … इसके साथ घूमने के एक दिन के बाद, मैंने अपने एचक्यूएल को वापस सादे एसक्यूएल में भेज दिया, लेकिन डाटाबेस में एक दृश्य में यह एक अच्छा विकल्प होगा। मेरे मामले में, क्वेरी के कुछ हिस्सों को गतिशील रूप से उत्पन्न किया गया था, इसलिए मुझे इसके बजाय कोड में SQL का निर्माण करना था।

मेरे पास एक महत्वपूर्ण परिदृश्य का हल है (जिसके लिए मैंने बहुत कुछ संघर्ष किया) HQL में संघ के साथ।

उदाहरण के लिए काम नहीं करने की बजाए: –

 select i , j from A a , (select i , j from B union select i , j from C) d where ai = di 

या

 select i , j from A a JOIN (select i , j from B union select i , j from C) d on ai = di 

आप हाइबरनेट एचक्यूएल में कर सकते हैं ->

 Query q1 =session.createQuery(select i , j from A a JOIN B b on ai = bi) List l1 = q1.list(); Query q2 = session.createQuery(select i , j from A a JOIN C b on ai = bi) List l2 = q2.list(); 

तो आप दोनों सूची जोड़ सकते हैं ->

 l1.addAll(l2); 

एक दृश्य एक बेहतर दृष्टिकोण है, लेकिन चूंकि एचक्यूएल आमतौर पर एक सूची या सेट देता है … आप list_1.add All (list_2) कर सकते हैं। एक संघ की तुलना में पूरी तरह से बेकार है लेकिन काम करना चाहिए

शायद मुझे हल करने के लिए एक और सीधे आगे की समस्या थी। उदाहरण के लिए मेरा '' जेपीए प्रदाता के रूप में हाइबरनेट के साथ जेपीए में था

मैंने तीन चयनों को एक दूसरे के चयन में विभाजित किया (दो दूसरे मामले में) और एकत्रित किए गए संग्रहों ने अपने आप को वापस कर दिया, प्रभावी रूप से एक 'संघ सभी' की जगह

मैं भी इस दर्द से गुजर रहा हूं – अगर क्वेरी गतिशील रूप से उत्पन्न होती है (उदाहरण के लिए सीतनिद्रा में होना मानदंड) तो मैं इसे करने का एक व्यावहारिक तरीका नहीं मिल सका।

मेरे लिए अच्छी खबर यह थी कि मैं ओरेकल डाटाबेस में किसी 'या' का प्रयोग करते समय केवल एक प्रदर्शन समस्या को हल करने के लिए संघ की जांच कर रहा था

पैट्रिक ने पोस्ट किया (नतीजा प्रोग्राम प्रोग्राम को एक सेट का संयोजन करना) जबकि बदसूरत (विशेषकर जब से मैं भी परिणाम पेजिंग करना चाहता था) मेरे लिए पर्याप्त था

जैसे पैट्रिक ने कहा, प्रत्येक SELECT से LISTS को जोड़ना एक अच्छा विचार होगा, लेकिन याद रखें कि यह UNION ALL की तरह कार्य करता है इस दुष्परिणाम से बचने के लिए, यदि अंतिम संग्रह में पहले से ही ऑब्जेक्ट जोड़ा गया है या नहीं, तो बस नियंत्रण करें। यदि नहीं, तो इसे जोड़ें।
कुछ और चीजें जिन पर आपको ध्यान रखना चाहिए कि यदि आपके पास प्रत्येक SELECT में कोई भी JOIN है, तो परिणाम ऑब्जेक्ट List<Objetc[]> ( List<Objetc[]> ) ताकि आपको उस ऑब्जेक्ट को रखने के लिए केवल उस ऑब्जेक्ट को रखना चाहिए जो आपको चाहिए ।

मुझे भरोसा है ये काम करेगा।

यहाँ एक विशेष मामला है, लेकिन आप अपने खुद के काम का निर्माण करने के लिए प्रेरित कर सकते हैं यहां लक्ष्य को दो अलग-अलग तालिकाओं से रिकॉर्ड की कुल संख्या की गणना करना है जहां रिकॉर्ड विशिष्ट मानदंडों को पूरा करते हैं। मेरा मानना ​​है कि यह तकनीक किसी भी मामले के लिए काम करेगी जहां आपको कई तालिकाओं / स्रोतों से डेटा इकट्ठा करने की आवश्यकता है

मेरे पास कुछ विशेष मध्यवर्ती कक्षाओं की स्थापना है, इसलिए नामित क्वेरी को कॉल करने वाला कोड छोटा और मीठा है, लेकिन आप अपनी क्वेरी को निष्पादित करने के लिए नामित क्वेरी के साथ सामान्य रूप से उपयोग की जाने वाली विधि का उपयोग कर सकते हैं।

 QueryParms parms=new QueryParms(); parms.put("PROCDATE",PROCDATE); Long pixelAll = ((SourceCount)Fetch.row("PIXEL_ALL",parms,logger)).getCOUNT(); 

जैसा कि आप यहां देख सकते हैं, नामित क्वेरी यूनियन स्टेटमेंट की तरह एक आभासी बहुत देखने लगती है:

 @Entity @NamedQueries({ @NamedQuery( name ="PIXEL_ALL", query = "" + " SELECT new SourceCount(" + " (select count(a) from PIXEL_LOG_CURR1 a " + " where to_char(a.TIMESTAMP, 'YYYYMMDD') = :PROCDATE " + " )," + " (select count(b) from PIXEL_LOG_CURR2 b" + " where to_char(b.TIMESTAMP, 'YYYYMMDD') = :PROCDATE " + " )" + ") from Dual1" + "" ) }) public class SourceCount { @Id private Long COUNT; public SourceCount(Long COUNT1, Long COUNT2) { this.COUNT = COUNT1+COUNT2; } public Long getCOUNT() { return COUNT; } public void setCOUNT(Long COUNT) { this.COUNT = COUNT; } } 

जादू का एक हिस्सा यहाँ एक डमी टेबल बनाने और इसमें एक रिकॉर्ड डालना है। मेरे मामले में, मैंने इसे दोहरी 1 नाम दिया है क्योंकि मेरे डेटाबेस में ओरेकल है, लेकिन मुझे नहीं लगता कि आप डमी टेबल को कहते हैं।

 @Entity @Table(name="DUAL1") public class Dual1 { @Id Long ID; } 

अपना डमी रिकार्ड सम्मिलित करने के लिए मत भूलना:

 SQL> insert into dual1 values (1);