如何将NamedJdbcTemplate与Postgres正则表达式一起使用

时间:2018-04-25 10:34:59

标签: java regex postgresql java-8 spring-jdbc

我正在使用Postgres:9.5.5和Spring-Jdbc:4.3.7。

我在postgres中的选择看起来像这样:

select id, birth_date, fullname from some_table where fullname ~ '\mSTACK\M'

如果fullname包含单词“STACK”,则返回true。

我在使用NamedJdbcTemplate在Java(8)中生成此查询时遇到问题:

String sql = "select id, fullname, birth_date from some_table where fullname ~ '\m:name\M' and birth_date = :birth_date";

SqlParameterSource params = new MapSqlParameterSource()
    .addValue("name", "STACK")
    .addValue("birth_date", "22.07.2002");

namedJdbcTemplate.query(sql, params, ....);

JDBC生成的SQL:

SELECT id, fullname, birth_date FROM some_table WHERE fullname ~ '\m:name\M' AND birth_date = ?;

正如您所看到的,birth_date参数没有问题, 但是JDBC没有放“?”字符而不是参数“:name”。

如何向JDBC解释我的参数“:name”被正则表达式包围?

谢谢!

1 个答案:

答案 0 :(得分:2)

'\m:name\M'这个结果是逻辑,因为你使用你的正则表达式和两个引号之间的参数。

您可以使用||将正则表达式与单词连接起来,如下所示:

fullname ~ ('\m' || :name || '\M')

如果:name param等于STOCK这会产生以下内容:

fullname ~ '\mSTOCK\M'