मैं निम्नलिखित समस्या 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>
वर्क्स एक आकर्षण की तरह।
यह! यह मेरे लिए तय किया। धन्यवाद! – 98percentmonkey