2012-03-13 3 views
5

मैं जावा/हाइबरनेट/ओरेकल का उपयोग कर रहा हूं। मेरे पास 3000 से अधिक प्रविष्टियों वाली एक सूची है। अगर मैं पूरी सूची पास करता हूं तो मुझे अपवाद नीचे मिलता है।इसके कारण: java.sql.SQLException: ORA-01795: सूची में अभिव्यक्तियों की अधिकतम संख्या 1000 है?

की वजह से: java.sql.SQLException: ORA-01,795: किसी सूची में भाव की अधिकतम संख्या 1000

मुद्दा मैं उप-सूचियों में सूची बंटवारे हूँ हल करने के लिए

है, प्रत्येक sublist होगा 1000 प्रविष्टियां हर हज़ार प्रविष्टियों के लिए मैं एक प्रश्न फायर कर रहा हूँ। यह ठीक काम कर रहा है।

कृपया मुझे स्पष्ट करें, क्या कोई बेहतर समाधान है?

धन्यवाद!

+0

ORA-01,795 एक Oracle त्रुटि कोड है, जो सुझाव है कि यह एक है: बस अपने कोड जहां कभी आप

addCriteriaIn(propertyName, mainList, criteria); 

जो विधि है साथ

criteria.add(Restrictions.in(propertyName, mainList)); 

इस्तेमाल किया की जगह हाइबरनेट, सीमा के बजाय ओरेकल। –

उत्तर

7

यह है, इसीलिए उसे एक Oracle त्रुटि कोड मिला है एक Oracle सीमा, है .. हालांकि आप तर्क दे सकते हैं कि यह हाइबरनेट की सीमा है कि यह पारदर्शी रूप से इसके आसपास काम नहीं करता है :)

आपको शायद सूची को अस्थायी तालिका में रखना चाहिए और उस पर शामिल होना चाहिए, मानते हैं कि ओरेकल में SQL की तरह कुछ भी नहीं है सर्वर का table-valued parameters। (या आप अपनी क्वेरी को कई प्रश्नों में विभाजित कर सकते हैं, जो कि आप कर रहे हैं पर निर्भर करता है।)

+0

वर्कअराउंड के लिए +1 :) इसके अतिरिक्त: एक त्वरित Google खोज एक ही समस्या के साथ पीपीएल की कई पोस्टों को प्रकट करती है - इसलिए इस प्रतिबंध पर काबू पाने के लिए पहले से ही कुछ दृष्टिकोण हो सकते हैं ... – quaylar

1

अपवाद-पाठ मुझे विश्वास है कि यह Oracle डाटाबेस से आ रही है की सुविधा देता है - त्रुटि पर विचार करते हैं ...

0

इस समस्या को हल करने का एक और तरीका भी है। मान लें कि आपके पास टेबल 1 और टेबल 2 टेबल हैं। और मानदंड क्वेरी का उपयोग कर तालिका 2 में निर्दिष्ट/उपस्थित तालिका 1 की सभी प्रविष्टियों को लाने की आवश्यकता है। तो आगे इस तरह जाना ...

List list=new ArrayList(); 
Criteria cr=session.createCriteria(Table1.class); 
cr.add(Restrictions.sqlRestriction("this_.id not in (select t2.t1_id from Table2 t2)")); 
. 
. 





List list=new ArrayList(); 
Criteria cr=session.createCriteria(Table1.class); 
cr.add(Restrictions.sqlRestriction("this_.id not in (select t2.t1_id from Table2 t2)")); 
list=cr.list(); 
. 
. 
. 

यह एसक्यूएल में 1000 या अधिक मापदंडों हाइबरनेट ढांचे द्वारा परिवर्तित को शामिल किए बिना एसक्यूएल में सीधे सब सबक्वेरी finction प्रदर्शन करेंगे। यह मेरे लिए काम किया। नोट: आपको अपनी आवश्यकता के अनुसार SQL भाग को बदलने की आवश्यकता हो सकती है।

+1

कृपया स्वरूपण सहायता को पढ़ना सुनिश्चित करें: -) – kleopatra

+0

@ क्लोपेट्रा, इसे इंगित करने के लिए धन्यवाद :-) मैंने इसे संपादित किया है –

0

यदि आप ओरेकल डीबी के साथ काम कर रहे हैं तो आप एक "जहां" स्थिति में 1000 से अधिक तत्वों के साथ एक सूची नहीं रख सकते हैं। तो आप कई "कहां" स्थितियों में अपनी "कहां" स्थिति को काट सकते हैं और उन्हें "या" खंड में शामिल कर सकते हैं।

यदि आप हाइबरनेट मानदंड का उपयोग कर रहे हैं, तो आप इसे करने के लिए जावा विधि का उपयोग कर सकते हैं।

private void addCriteriaIn (String propertyName, List<?> list,Criteria criteria) 
    { 
    Disjunction or = Restrictions.disjunction(); 
    if(list.size()>1000) 
    {   
     while(list.size()>1000) 
     { 
     List<?> subList = list.subList(0, 1000); 
     or.add(Restrictions.in(propertyName, subList)); 
     list.subList(0, 1000).clear(); 
     } 
    } 
    or.add(Restrictions.in(propertyName, list)); 
    criteria.add(or); 
    } 
संबंधित मुद्दे