2013-04-21 2 views
1

у меня есть мой ниже метод, который будет принимать два parameters-Как создать SQL из входов методу

final String userId- Primary Key for the database

final Collection<String> attributeNames- list of column names that I want to retrieve

Ниже приведен код

public Map<String, String> getAttributes(final String userId, final Collection<String> attributeNames) { 

    //Below line doesn't works out the way I wanted 
    String query="SELECT" +attributeNames.toString()+ ", * from test where id = "+userId+ ";"; 
    ResultSet result = CassandraDatastaxConnection.getInstance().getSession().execute(query); 
    for (Row rows: result){ 
     System.out.println(rows.getString("key")); 
    } 

    return attributes; 
} 

давайте возьмем пример, userId as 40

Образец attributeNames будет выглядеть this-

[account, behavior, segmentation] 

Теперь мне нужно генерировать SQL, соответствующий входам. Так для вышеприведенного примера, SQL должен выглядеть this-

SELECT account, behavior, segmentation from test where id = "40"; 

Как я могу генерировать SQL, как это из вышеупомянутых входов? Спасибо за помощь.

+0

Что значит генерировать? Вернуть его как таковой или взять ввод параметров и использовать их в своем SQL-запросе? –

+0

По сгенерированию я имею в виду, что соответствует входам, я должен быть в состоянии сделать sql. Взгляните на мой пример. – 2013-04-21 02:06:52

ответ

1

Вы можете использовать что-то вроде attributeNames.toString().substring(1, attributeNames.toString().length()-1)

0

Изменения этой функции

public Map<String, String> getAttributes(final String userId, final Collection<String> attributeNames) { 
//Below line doesn't works out the way I wanted 
String query="SELECT" +attributeNames.toString()+ ", * from test where id = "+userId+ ";"; 
ResultSet result = CassandraDatastaxConnection.getInstance().getSession().execute(query); 
for (Row rows: result){ 
    System.out.println(rows.getString("key")); 
} 

return attributes; 
} 

к этому

public Map<String, String> getAttributes(final String userId, final Collection<String> attributeNames) { 

//Below line doesn't works out the way I wanted 
StringBuilder sb = new StringBuilder(attributeNames.size()); 

for(int i = 0; i<attributeNames.size();i++) 
{ 
    sb.append(attributeNames.get(i)); 
    if(i != attributeNames.size() - 1) 
      sb.append(","); 
} 
String query="SELECT" +sb.toString()+ " from test where id = "+userId+ ";"; 
ResultSet result = CassandraDatastaxConnection.getInstance().getSession().execute(query); 
for (Row rows: result){ 
    System.out.println(rows.getString("key")); 
} 

return attributes; 
} 

модифицированной функции запускает цикл по именам атрибутов и формирует часть запроса в имя1 , name2, name3 и т. д., а затем добавляет его в тело запроса. Надеюсь, это решает вашу проблему.

+0

Вы можете использовать 'StringBuilder' для переменной' attrs', это будет намного более эффективно. –

+0

Спасибо, отредактировал ответ. – tausun

Смежные вопросы