获取除to_date模式之外的绑定名称

时间:2018-03-20 15:02:56

标签: java sql regex

我正在使用数据库连接的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(不正确)作为绑定。

如何排除此日期模式以获取绑定?

1 个答案:

答案 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字符串。通常一个不应该引用命名参数,因为使用它们的全部要点是让框架根据它们的类型找出正确的转义。您是否正在编写自己的框架来处理命名参数?