2017-01-28 6 views
0

Как сделать строковую переменную searchQuery, переданную из SearchResultsActivity в строку SearchResultPresenter в строку where clause. БлагодаряВставьте строковую переменную внутри инструкции Where

Моя активность

public class SearchResultsActivity ...{ 
... 

mPresenter.getUsers(searchQuery); 

... 

} 

Мои Presenter

public class SearchResultPresenter ...{ 

... 
public void getUsers(String searchQuery) { 

String query = "....Contains(name, 'searchQuery') "; // this doesn't work, shows the method parameter `searchQuery` is never used. 

String whereClause = String.format(query, ...); 

} 

}

+0

Лучше использовать параметры 'PreparedStatement' и * bind *. Использовать 'String.format' похоже (с'% s' вместо '?'). 'String query =" .... Содержит (имя, '% s') ";' И затем 'String.format (query, searchQuery);' –

ответ

0

Обычно вы будете использовать PreparedStatement для этого, а параметр в строке будет просто знак вопроса. Что-то вроде этого:

Connection con = DriverManager.getConnection(url, "UN", "PW"); 
    PreparedStatement ps = con.prepareCall("select * from table where contains(textcol,?)"); 
    ps.setString(1,"the string that will replace the question mark"); 
///in your case 
ps.setString(1,searchQuery); 
    ResultSet rs = ps.executeQuery(); 

Если параметр является INT, вы могли бы сделать ps.setInt (...) вместо этого. Также возможно, но не рекомендуется, просто конкатенировать значение в строку, но это может открыть вам всевозможные проблемы, так что не утруждайте себя привычкой делать это.

так что вы в качестве кода, вы можете использовать переменную типа строки поиска прямо в методе ps.setString(), и ваша строка запроса может быть статической конечной строкой уровня класса с вопросительным знаком в ней.

+0

Спасибо @markg, Позвольте мне попробовать и вернуться. Моя ближайшая дилемма - это то, как я определял бы активное соединение «con», поскольку я использую backend как услугу, точно бездействующую. – Geob

+0

, как правило, код, который я опубликовал, будет запускаться внутри вашей конечной точки (например, в Tomcat или причал и т. Д. На вашем веб-сервере), и ваш вызов службы просто примет параметр строки поиска ... если я действительно понимаю, о чем вы говорите ;-) – markg

0

Вы можете использовать String.format(), чтобы выполнить это.

String query = String.format("....Contains(name, '%s')", searchQuery); 
+0

Вы имеете в виду String query = String.format (".... Содержит (имя, '% s')", searchQuery); – Geob

+0

Спасибо Jesse за редактирование, это безопасная инъекция sql? – Geob

+0

Это не очень хорошая идея, если вы не уверены, что строка не будет содержать символов, которые заставят полный текстовый поиск выкинуть исключение. Если в searchQuery есть «в нем», он сломается и т. Д. И в зависимости от того, где выполняется этот оператор, да, он теоретически может создавать проблемы с SQL-инъекциями – markg

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