2015-02-11 2 views
1

У меня есть LinkedHahMap map1 whcih держит ключ как мой beam_current, который имеет двойной тип и значение, как мой logtime, который строкового типа. Теперь я хочу, чтобы использовать эту map1.keySet() в моем запросе SQL как-Как я могу использовать map.KeySet() в запросе SQL в 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 ключа ** не отображается ничего. ** Не можем ли мы использовать метод map1.KeySet() в sql-запросе или я внедряю его неправильно?

+0

' "+ обр +"' == arr.toString() == [1,2,3] == .beam_current in ('[1,2,3]') "; – degr

+0

Вы должны создать правильный строковый список значений или переопределить toString, но, пожалуйста, не используйте этот вид запросов строятся без параметров, они подвержены SQL-инъекции ... https://www.owasp.org/index.php/Preventing_SQL_Injection_in_Java – Paolof76

ответ

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

+0

@MES thaks MES Я редактировал мои ответ –

+0

@atsih, я не могу ee ваше редактирование и когда я реализую thsi, я получаю исключение ** Тип несоответствия: невозможно преобразовать из HashSet в список ** и, кроме того, другое исключение ** StringUtils не может быть разрешено ** происходит – MES

0

Если вы не хотите зависеть от внешних LIBS (как 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(); 
} 
Смежные вопросы