2015-02-11 44 views
1

我有一個LinkedHahMap MAP1 whcih持有關鍵我的beam_current這是double類型的值作爲我logTime Description該條是字符串類型的。 現在,我想在我的SQL查詢中使用此map1.keySet()AS-我如何在SQL查詢中使用map.KeySet()在Java中

Set<Double> arr= map1.keySet(); 
String vs2="select b.beam_current, b.beam_energy where 
      b.logtime between '"+first+"' and '"+last+"' and b.beam_current in('"+arr+"')"; 

但是當我使用編曲其中持有MAP1關鍵值,**正在顯示任何內容。**我們不能在sql查詢中使用map1.KeySet()方法,或者我以錯誤的方式實現它?

+0

' 「+ ARR +」' == arr.toString() == [1,2,3] == .beam_current in('[1,2,3]')「; – degr 2015-02-11 10:38:16

+0

您應該生成一個正確的值列表或重寫toString,但請不要使用這種類型的查詢生成沒有參數,他們很容易SQL注入... https://www.owasp.org/index.php/Preventing_SQL_Injection_in_Java – Paolof76 2015-02-11 10:41:22

回答

2

首先將您的地圖鍵轉換爲逗號分隔的字符串,然後在查詢中使用它。

List<Double> slist = new ArrayList<Double>(map1.keySet()); 
    String s = StringUtils.join(slist, ','); 


     String vs2="select b.beam_current, b.beam_energy where 
        b.logtime between '"+first+"' and '"+last+"' and  
        b.beam_current in('"+s+"')"; 
+0

什麼是slist?是它d ?? – MES 2015-02-11 10:43:56

+0

@MES泰克斯我編輯了我的MES回答 – 2015-02-11 10:44:29

+0

@atsih,我不能ee你的編輯,當我實現thsi我得到一個異常**類型不匹配:無法從HashSet 轉換爲列表 **,而且另一個異常** StringUtils無法解析**發生 – MES 2015-02-11 10:46:46

0

如果你不想依賴於外部庫(如StringUtils.join),您可以手動做到這一點:

public static void main(String[] args) { 
    HashMap<Double, String> map1 = new HashMap<Double, String>(); 
    map1.put(1.5, ""); 
    map1.put(2.5, ""); 
    String first = "first"; 
    String last = "last"; 

    String query = buildQuery(map1, first, last); 
    System.out.println(query); 
} 

private static String buildQuery(HashMap<Double, String> map1, String first, String last) { 
    StringBuilder sb = new StringBuilder(); 
    sb.append("select b.beam_current, b.beam_energy where b.logtime between '"); 
    sb.append(first); 
    sb.append("' and '"); 
    sb.append(last); 
    sb.append("' and b.beam_current in ("); 
    String separator = ""; 
    for (Double val : map1.keySet()) { 
     sb.append(separator); 
     sb.append(val); 
     separator = ", "; 
    } 
    sb.append(")"); 
    return sb.toString(); 
}