2012-09-10 21 views
5

मैं निम्नलिखित समस्या MyBatis 3.0.6 का उपयोग कर के लिए एक समाधान यह पता लगाने की कोशिश कर रहा हूँ के लिए:नेस्टेड foreach एक HashMap पैरामीटर

मैं मानकों की एक श्रृंखला पर आधारित गतिशील चयन बयान का निर्माण करने की जरूरत है, एक जिसमें से HashMap<String, List<String>> है। चुनौती यह है कि बाहरी फोरैच लूप में सभी चाबियों पर माइबैटिस को फिर से बनाने के तरीके को पहचानने के साथ-साथ आंतरिक लूप में मूल्य सूची के तत्वों पर पुनरावृत्ति करना है।

, इसे समझने के लिए मेरी हैश नक्शा पैरामीटर फिल्टर शामिल राज्यों बुलाया (राज्य कोड की सूची प्रत्येक सूची, मूल्य जा रहा है) लगता है देश के आधार पर तो जैसे (कुंजी के रूप में देश कोड):

'US' -> {'CO','NY','MI','AZ'}; 
'CA' -> {'ON','BC','QC'} 

मैं अपने गतिशील एसक्यूएल इस तरह देखने के लिए (एक निहायत सरलीकृत रूप में) की जरूरत है:

SELECT * 
FROM Table1 
WHERE ... some static criteria goes here... 
     AND RowId IN (SELECT RowId FROM Table2 WHERE Country = 'US' AND State IN ('CO','NY','MI','AZ') 
     AND RowId IN (SELECT RowId FROM Table2 WHERE Country = 'CA' AND State IN ('ON','BC,'QC') 

मैं अपने नक्शाकार एक्सएमएल कल्पना कर सकते हैं कुछ इस तरह दिखना चाहिए:

<select id="getData" resultType="QueryResult"> 
SELECT * 
FROM Table1 
WHERE ... some static criteria goes here... 
    <if test="filter != null"> 
     <foreach item="country" index="i" collection="filter" separator="AND"> 
      RowId IN (SELECT RowId 
         FROM Table2 
         WHERE Country = #{country} AND State IN 
      <foreach item="state" index="j" collection="country.states" separator="," open="(" close=")"> 
       #{state} 
      </foreach> 
     </foreach> 
    </if> 
</select> 

तो सवाल है, क्या नेस्टेड foreach पाश में अधिक तेज़ी से दोहराने में country.states पाने के लिए उचित सिंटैक्स है?


अद्यतन

कुछ फेरबदल के बाद मुझे MyBatis HashMap आधारित दृष्टिकोण के साथ अच्छी तरह से खेलने के लिए नहीं मिल सका, तो मैं एक नया वर्ग है कि उनके माता-पिता मूल्य के लिए एक से अधिक मान नक्शे जोड़ने समाप्त हो गया, फिर MyBatis को ऐसी वस्तुओं की एक सूची गुजर रही है। ऊपर देशों/राज्यों उदाहरण का उपयोग करना, वर्ग तो दिखाई देता है:

public class Filter { 
    private String country; 
    private ArrayList<String> states; 

    // ... public get accessors here ... 
} 

डीएओ विधि:

public void QueryResult[] getResults(@Param("criteria") List<Filter> criteria) ... 

और MyBatis मानचित्रण:

<select id="getData" resultType="QueryResult"> 
SELECT * 
FROM Table1 
WHERE ... some static criteria goes here... 
    <if test="criteria!= null"> 
     <foreach item="filter" index="i" collection="criteria" separator="AND" open="AND"> 
      RowId IN (SELECT RowId 
         FROM Table2 
         WHERE Country = #{filter.country} AND State IN 
      <foreach item="state" index="j" collection="filter.states" separator="," open="(" close=")"> 
       #{state} 
      </foreach> 
     </foreach> 
    </if> 
</select> 

वर्क्स एक आकर्षण की तरह।

उत्तर

3

असल में, आप फ़िल्टर वैल्यू में इसे देखने के लिए देश के मूल्य का उपयोग कर सकते हैं और इसे प्रारंभ में शुरू कर सकते हैं। दूसरे लूप में, आपका संग्रह filter.get(country) के रूप में परिभाषित किया जाएगा और यह अच्छा होना चाहिए। यह निश्चित रूप से विचार कर रहा है कि मैं आपके प्रश्न को सही तरीके से व्याख्या कर रहा हूं।

1

मेरे पास मानचित्र के रूप में डालने वाला कुछ था जहां प्रत्येक मानचित्र कुंजी मानचित्र सूची में था। मैंने इस तरह से प्रश्न लिखा था।

INSERT INTO TB_TEST (group_id, student_id) VALUES 
<foreach collection="idMap.entrySet()" item="element" index="index" separator=","> 
     <foreach collection="element.value" item="item" separator="," > 
      (#{element.key} #{item})  
     </foreach> 
    </foreach> 
+0

यह! यह मेरे लिए तय किया। धन्यवाद! – 98percentmonkey

0

अभी तक, मैं यह कर सकता हूं।

<foreach collection="myMap" index="key" item="value"> 
    <foreach collection="value" item="element"> 
    ... = #{key} ... 
    ... = #{element}) 
    </foreach> 
</foreach>