之前没问题的程序,改了SQL之后,报告异常:
No value supplied for the SQL parameter 2
奇怪的是根本没有这个参数。别的参数也正常设置了。
后来跟踪进了Spring的源代码在org.springframework.jdbc.core.namedparam.NamedParameterUtils.parseSqlStatement@92,发现Spring进行参数匹配的时候,用的是: 和 & 这两个作为参数的前缀:
if (c == ':' || c == '&') {
int j = i + 1;
if (j < statement.length && statement[j] == ':' && c == ':') {
// Postgres-style "::" casting operator - to be skipped.
i = i + 2;
continue;
}
while (j < statement.length && !isParameterSeparator(statement[j])) {
j++;
}
if (j - i > 1) {
String parameter = sql.substring(i + 1, j);
if (!namedParameters.contains(parameter)) {
namedParameters.add(parameter);
namedParameterCount++;
}
parsedSql.addNamedParameter(parameter, i, j);
totalParameterCount++;
}
i = j - 1;
}
原来如此。这就是为啥以前的程序没有问题,而新的代码加了个条件:
sql = "..... where flag &2 = 2"
后就出错了。原因是这个&运算符后面的2被当成参数了。
查了下貌似Spring本身没有什么改法,只能用另一种等价的sql来代替:
.... where ( flag div 2 ) % 2 = 1
问题解决。