如果我有一个搜索模块,其中包含以下内容: 搜索框,下拉列表1,下拉列表2。
我有这样的查询:
SELECT * FROM MY_TABLE where q1 = 'searchBox' AND q2 = 'dropdown1' AND q3 = 'dropdown2'
如何根据用户过滤器使该查询动态化,因此如果用户仅填写搜索框,则查询将为:
SELECT * FROM MY_TABLE where q1 = 'searchBox'
如果用户填写搜索框和dropdown1,则查询将为:
SELECT * FROM MY_TABLE where q1 = 'searchBox' AND q2 = 'dropdown1'
如果用户没有填写任何内容,则查询将为:
SELECT * FROM MY_TABLE
我正在使用Java。
答案 0 :(得分:2)
有一些框架可以帮助解决这个问题:
如果您想创建快速简单的解决方案,可以执行以下操作:
List<String> params = new ArrayList<>();
StringBuilder sb = new StringBuilder();
sb.append("SELECT * FROM MY_TABLE WHERE 1 = 1");
if (searchBox != null) {
sb.append(" AND q1 = ?");
params.add(searchBox);
}
if (dropdown1 != null) {
sb.append(" AND q2 = ?");
params.add(dropdown1);
}
if (dropdown2 != null) {
sb.append(" AND q3 = ?");
params.add(dropdown2);
}
PreparedStatement preparedStatement = connection.prepareStatement(sb.toString());
for (int i = 1; i <= params.size(); i++) {
preparedStatement.setString(i, params.get(i));
}
ResultSet resultSet = preparedStatement.executeQuery();