我正在使用数据库连接的java应用程序。我有一个像
这样的绑定的查询select name from employee where salary >= :sal
获取我拥有的每个绑定的名称
List<String> getParameterNames(String query) {
Pattern p = Pattern.compile(":[^\\s\\%\\?']+");
Matcher m = p.matcher(query);
// without duplications
Set<String> bindings = new LinkedHashSet<>();
while (m.find()) {
bindings.add(m.group().substring(1));
}
return new ArrayList<>(bindings);
}
用户可以为每个绑定定义自己的值。查询和值(及其名称)存储在数据库中。查询也通过EXECUTE IMMEDIATE
在数据库中执行,因此我无法使用JDBC。这工作正常,但如果查询包含类似
select name from employee where hire_date >= to_date(':date', 'YYYY-MM-DD HH24:MI:SS')
使用我的代码,我将date
(正确)和MI:SS
(不正确)作为绑定。
如何排除此日期模式以获取绑定?
答案 0 :(得分:0)
这可能不是你想要的,但你可以看一下spring-jdbc NamedParameterUtils.parseSqlStatement()
方法。不幸的是,它会返回一个ParsedSql
对象,这些对象无法在org.springframework.jdbc.core.namedparam
包之外访问。
String sql = "select name from employee where hire_date >= to_date(:date, 'YYYY-MM-DD HH24:MI:SS')";
ParsedSql parsedSql = NamedParameterUtils.parseSqlStatement(sql);
List<String> paramNames = parsedSql.getParameterNames();
':date'
看起来不像是有效的参数名称。它只是一个:date
值的SQL字符串。通常一个不应该引用命名参数,因为使用它们的全部要点是让框架根据它们的类型找出正确的转义。您是否正在编写自己的框架来处理命名参数?