2012-06-19 30 views
13

मुझे फ़ूज़ के साथ एक MySQL तालिका मिली है। प्रत्येक फू में एक संख्यात्मक गैर-अद्वितीय कोड और एक नाम होता है। अब मुझे यह पता लगाने की ज़रूरत है कि किसी निश्चित कोड में से किसी एक के साथ कोई फू नाम होता है जो किसी दिए गए स्ट्रिंग से शुरू होता है। सामान्य एसक्यूएल में यह छोटा होगा:जावा स्प्रिंग फ्रेमवर्क के साथ स्ट्रिंग LIKE 'कुछ%' की खोज कैसे करें?

select * from FOO where CODE in (2,3,5) and NAME like 'bar%'; 

लेकिन अब मैं वसंत में यह कैसे ठीक से करूं? 'पसंद' ऑपरेटर की आवश्यकता के बिना मैं इसे इस तरह करना चाहते हैं:

public List<Foo> getByName(List<Integer> codes, String namePart) { 
    String sql = "select * from FOO where CODE in (:codes) and NAME=:name" 
    Map<String,Object> params = new HashMap<String,Object>(); 
    params.put("codes", codes); 
    params.put("name", namePart); 
    return getSimpleJdbcTemplate().query(sql, new FooRowMapper(), params); 
} 

हालांकि, के साथ कुछ भी नहीं काम करने के लिए लगता है 'पसंद': NAME like :name%, NAME like ':name%', या NAME like ?% जब बजाय प्लेसहोल्डर नाम वाले पैरामीटर का उपयोग कर।

मैं क्रूर हो सकता है और के रूप में

String sql = "select * from FOO where CODE in (:codes) and NAME like '"+namePart+"%'";` 

डालें लेकिन स्पष्ट रूप से यह अच्छा की तुलना में अधिक हो सकता है अगर स्प्रिंग इनपुट पैरामीटर ठीक से आदि स्वच्छ होगा, तुम्हें पता है ...

आप लगता है कि वसंत इस तरह का समर्थन करेगा लेकिन मैं इसे समझ नहीं सकता।

+0

यह मेरे लिए काम करता है, तो मैं का उपयोग करें: FOO से "का चयन करें * जहां कोड में (: कोड) और NAME जैसे "+ namePart +" '%' "; – navy

उत्तर

18

प्रतीक्षा, बेशक मैं इसे एक दिन फोन करने से पहले "एक और अंतिम बात की कोशिश" था, और लो और निहारना, मेरे सभी इकाई परीक्षण अचानक पारित:

public List<Foo> getByName(List<Integer> codes, String namePart) { 
    String sql = "select * from FOO where CODE in (:codes) and NAME like :name" 
    Map<String,Object> params = new HashMap<String,Object>(); 
    params.put("codes", codes); 
    params.put("name", namePart+"%"); 
    return getSimpleJdbcTemplate().query(sql, new FooRowMapper(), params); 
} 

मैं में प्रवेश करने के बारे में सोच नहीं था पैरामीटर में "%", मुझे यकीन था कि वसंत स्वचालित रूप से इससे बच जाएगा। मुझे आश्चर्य है कि मैं इसे सही कर रहा हूं?

+0

नेरफ, वह समाधान था जो मैं देने वाला था: डी जिस तरह से मैं इसे यहां कर रहा था, इससे पहले कि मैं माईबेटिस में गया, लेकिन यह एक और कहानी है: पी –

+0

AFAIK स्प्रिंग करता है बचें लेकिन केवल एसक्यूएल इंजेक्शन को रोकने के लिए। अन्यथा, जैसे अभिव्यक्ति की अपेक्षा है, और% अभिव्यक्ति का हिस्सा है, इसलिए मुझे इस तरह से कम या ज्यादा तार्किक लगता है। –

+0

@OlivierCoilland Ha, आपके उत्तर को चोरी करने के लिए खेद है।) धन्यवाद हालांकि पुष्टि के लिए, कम से कम मुझे पता है कि कोई और इस तकनीक का भी उपयोग करता है। और माइबेटिस के सूचक के लिए धन्यवाद; मैंने पहले कभी इसके बारे में नहीं सुना है लेकिन यह दिलचस्प लग रहा है। – ZeroOne

3

नामित paraemters काम करने के लिए, आप का उपयोग करने के NamedParameterJdbcTemplate

params.put जरूरत है ("नाम", "जो%");

jdbcTemplate.query ("का चयन करें * FOO से जहां कोड में (: कोड) और नाम की तरह: नाम"