NamedParameterJdbcTemplate Oracle SQL,如何在命名查询中转义单引号?
Posted
技术标签:
【中文标题】NamedParameterJdbcTemplate Oracle SQL,如何在命名查询中转义单引号?【英文标题】:NamedParameterJdbcTemplate Oracle SQL, how to escape single quote in named query? 【发布时间】:2017-08-12 16:36:42 【问题描述】:我有以下代码,我似乎无法弄清楚如何转义命名参数周围的单引号。在生成的查询中,我需要在它的两边加上单引号:
public List<Vehicle> findByApplicationId(String applicationId)
// example application id is a string like 12345
MapSqlParameterSource sqlParameterSource = new MapSqlParameterSource();
sqlParameterSource.addValue("applicationId", applicationId);
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("SELECT make, model");
stringBuilder.append(" FROM vehicle");
stringBuilder.append(" WHERE model IN (SELECT id FROM auto WHERE model_app IN (");
stringBuilder.append(":applicationId");
stringBuilder.append("))");
// in the resulting query the applicationId must appear
// as '12345', meaning with single quotes around it
return jdbcTemplate.query(stringBuilder.toString(), sqlParameterSource,
// lambda used as row mapper
(resultSet, rowNumber) -> ...
...
我尝试像stringBuilder.append("'':applicationId''");
那样在name 参数周围加上双单引号,但没有成功。根据我在 SO 上看到的其他答案,我尝试了单引号和许多其他类似的单引号和双引号组合。好像没看懂。
【问题讨论】:
如果将值绑定为字符串,则不需要单引号。 @AlexPoole 我确实尝试过不带引号。尽管在通过调试日志查看生成的查询时命名参数会解析,但我仍然没有获取数据,而在 SQL 客户端中将完全相同的查询放入提取数据。所以我认为查询中没有正确发送某些内容。你能用一个小例子说明你的意思吗?我什至尝试使用不同的引用组合来制作命名参数和整数。有时它会解析但引号数量错误,有时该查询被认为是错误的 SQL 语法。 单引号不是答案。您将搜索文字字符串值':applicationId'
,它不会被视为绑定变量,并且不会使用实际值 12345。您是否可能只是在可以看到它的 SQL 客户端中插入了您正在寻找的数据 - 并且尚未提交?只是一个想法。否则列数据类型是什么?
@AlexPoole 同意,我意识到目前很难,因为我有上面的代码,调试日志中的结果查询(它的结尾)看起来像...IN (?))]
,但事实并非如此t 获取任何数据,而将 name 参数的文本替换为它的值。
文字替换适用于 Java(带有转义的单引号),而不仅仅是来自您的 SQL 客户端!?如果你在parm中连接怎么样?您是否检查过实际值没有尾随空格或其他一些数据类型问题?
【参考方案1】:
事实证明,我的问题根本不是 Alex Poole 建议的单引号(谢谢 Alex)。我的 Java 字符串需要转换为 Oracle 类型 CHAR(17)。在我这样做之后,不需要单引号或双引号,并且我的命名参数正确解析并且查询有效。
【讨论】:
以上是关于NamedParameterJdbcTemplate Oracle SQL,如何在命名查询中转义单引号?的主要内容,如果未能解决你的问题,请参考以下文章