2009-11-10 12 views
8

मैं एक संग्रहीत प्रक्रिया चला रहा हूं जो 2 कर्सर देता है और उनमें से कोई भी डेटा नहीं है। मैं निम्नलिखित मानचित्रण एक्सएमएल है:iBatis कोई पॉप नहीं है जब कोई पंक्ति नहीं है

<resultMap id="resultMap1" class="HashMap"> 
    <result property="firstName" columnIndex="2"/> 
</resultMap> 

<resultMap id="resultMap2" class="com.somePackage.MyBean"> 
    <result property="unitStreetName" column="street_name"/> 
</resultMap> 

<parameterMap id="parmmap" class="map"> 
    <parameter property="id" jdbcType="String" javaType="java.lang.String" mode="IN"/> 
    <parameter property="Result0" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet" mode="OUT" resultMap="resultMap1"/> 
    <parameter property="Result1" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet" mode="OUT" resultMap="resultMap2"/> 
</parameterMap> 

<procedure id="proc" parameterMap="parmmap"> 
    { call my_sp (?,?,?) } 
</procedure> 

सबसे पहले परिणाम सेट एक HashMap में डाल जा रहा है ... दूसरा ResultSet एक MyBean वर्ग में डाल दिया जा रहा है।

मेरी डीएओ में

कोड इस प्रकार है:

HashMap map = new HashMap() 
map.put("id", "1234"); 
getSqlMapClientTemplate().queryForList("mymap.proc", map); 
HashMap result1 = (HashMap)((List)parmMap.get("Result0")).get(0); 
MyBean myObject = (MyBean)((List)parmMap.get("Result1")).get(0);//code fails here 
अंतिम पंक्ति में

above..my कोड विफल रहता है। यह विफल रहता है क्योंकि दूसरे कर्सर की कोई पंक्ति नहीं है और यही कारण है कि सूची में कुछ भी क्यों नहीं रखा जाता है। हालांकि, पहला कर्सर कुछ भी नहीं लौटाता है, लेकिन परिणाम HashMap में डाले जा रहे हैं क्योंकि पहले कर्सर के लिए सूची में HashMap ऑब्जेक्ट है ..

यह अंतर क्यों? क्या आईबेटिस सूची में माईबीन का ऑब्जेक्ट डालने का कोई तरीका है, भले ही कोई पंक्तियां वापस न हों? या मुझे इसे अपने डीएओ में संभालना चाहिए ... मैं इसे डीएओ में संभालने से बचना चाहता हूं क्योंकि मेरे पास डीएओ का पूरा समूह है।

उत्तर

0

दरअसल मुझे विश्वास है कि Result1 व्यवहार सही है (कोई परिणाम हमेशा खाली सूची में नहीं लेना चाहिए)।

आपके द्वारा Result0 को दोबारा जांचने के बाद वास्तव में एक खाली कर्सर है (उदाहरण के लिए - एक कर्सर जिसमें सभी ऑल-फ़ील्ड-नल-पंक्ति है), मुझे लगता है कि आप एक बग के लिए शिकार करना शुरू कर सकते हैं iBatis :)

आपके दूसरे प्रश्न के लिए, मुझे विश्वास नहीं है कि iBatis आपकी मदद कर सकता है (या यह चाहिए: ऐसा डिफ़ॉल्ट डेटाबेस ⇔ एप्लिकेशन इंटरफ़ेस का हिस्सा नहीं है और इसलिए डीएओ में सबसे अच्छा संभाला जाना चाहिए - या शायद आपकी सेवाओं के पदानुक्रम को और भी आगे बढ़ाएं)।

1

परिणामस्वरूप खाली होने पर इबेटिस वस्तुओं को तत्काल या वापस नहीं करता है (या आपके मामले में, यदि आपकी संग्रहीत प्रक्रिया का तीसरा पैरामीटर शून्य हो जाता है)।

मैंने देखा कि लिखने वाले हैंडलर जब उन्हें कोई परिणाम नहीं लौटाया जाता है, तो मार्ग भी मदद नहीं करेगा।

मुझे यकीन है कि इस मामले में खाली वस्तुओं को तुरंत चालू करने के आपके अच्छे कारण हैं, लेकिन मुझे डर है कि आपके डीएओ में नल का पता लगाने का एकमात्र तरीका है।

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