0

我是spring 框架的新手。我正在尝试使用与多个模式匹配的NamedParameterJdbcTemplate从 SQL Server 2005 数据库表中检索记录集(模式存储在 ArrayList 中)。

下面的代码检索匹配一组值的记录集:

List<String> valuesForBuildingPatterns1 = getValuesForBuildingPatterns1();
List<String> valuesForBuildingPatterns2 = getValuesForBuildingPatterns2();
String sqlQuery = "SELECT * FROM sqlServerTable col1 IN (:pattern1) AND col2 IN (:pattern2)";
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("pattern1", valuesForBuildingPatterns1);
params.addValue("pattern2", valuesForBuildingPatterns2);
resultset = namedParameterJdbcTemplate.query(sqlQuery, params, new MyRowMapper());

问题:我不想搜索字符串值列表,而是要搜索正则表达式模式列表(如 %xyz%)。但我无法在 SQL 查询中同时使用“IN”子句和“LIKE”运算符,如下所示:

List<String> pattern1 = new ArrayList<String>();
List<String> pattern2 = new ArrayList<String>();

for(String str : valuesForBuildingPatterns1)
pattern1.add("%"+str+"%"); //If str="xyz", it adds "%xyz%" to the new list
for(String str : valuesForBuildingPatterns2)
pattern2.add("%"+str+"%");

String sqlQuery = "SELECT * FROM sqlServerTable col1 IN LIKE (:pattern1) AND col2 IN (:pattern2)";
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("pattern1", pattern1);
params.addValue("pattern2", pattern2);
resultset = namedParameterJdbcTemplate.query(sqlQuery, params, new MyRowMapper());

我还尝试循环遍历列表并使用“LIKE”运算符单独构建 SQL 查询,而不使用“IN”子句。但是 query() 方法不接受这一点。此外,我猜,像这样构建 SQL 查询胜过使用 NamedParameterJdbcTemplate 的主要目的。

for(String str1 : valuesForBuildingPatterns1)
for(String str2 : valuesForBuildingPatterns2)
{
String sqlQuery = "SELECT * FROM sqlServerTable col1 LIKE " + str1 + " AND col2 LIKE " + str2";
resultset.add(namedParameterJdbcTemplate.query(sqlQuery,null,new MyRowMapper()));
}

你能指导我解决这个问题吗?请告知是否需要更多信息,并请原谅我的无知,因为对框架了解不多。非常感谢。非常感谢您的帮助。

PS:该项目正在使用我工作的组织开发的内部工具进行开发。该工具基于 Spring 框架构建,因此支持 Spring 框架提供的所有服务。

4

1 回答 1

0

我想出了一个方法来实现它。多谢你们。

StringBuilder sb = new StringBuilder();     
for(String str1 : valuesForBuildingPatterns1)
for(String str2 : valuesForBuildingPatterns2)
sb.append(" col1 LIKE '%" + str1 + "%' AND col2 LIKE '%" + str2 + "%' OR");

sb.delete(sb.length()-2, sb.length());

String sqlQuery = "SELECT * FROM sqlServerTable WHERE" + sb.toString();
resultset = namedParameterJdbcTemplate.query(sqlQuery, params, new MyRowMapper());
于 2013-07-12T15:32:28.493 回答