一个Spring NamedParameterJdbcTemplate的异常

之前没问题的程序,改了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
问题解决。



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值