安全地为查询准备逗号分隔列表[重复]
Posted
技术标签:
【中文标题】安全地为查询准备逗号分隔列表[重复]【英文标题】:Safely prepare comma delimited list for query [duplicate] 【发布时间】:2012-04-13 13:04:27 【问题描述】:可能重复:How to generate a dynamic “in (…)” sql list through Spring JdbcTemplate?
我正在尝试为 java 中的 MsSQL 中的 IN()
子句准备一个 ID 列表。我有下面的代码,它看起来应该可以工作,但它抛出了错误:java.sql.SQLException: Conversion failed when convert the nvarchar value '1,2' to data type int.
我有点不知所措,为什么当我传递一个字符串时它会像整数一样尝试它。任何见解都会很棒。
我也尝试过将template.getId()
更改为template.getId().toString()
,但没有成功
//JOINs
Collection<Template> templates = search.getTemplateCollection();
if (templates != null && templates.size() > 0)
searchQuery.append("INNER JOIN dbo.content_to_template ON content_to_template.template_id IN (:templateIds) AND content_to_template.content_id = content.id ");
StringBuilder templateIds = new StringBuilder();
for (Template template : templates)
if (templateIds.length() == 0)
templateIds.append(template.getId());
else
templateIds.append(",").append(template.getId());
queryMap.put("templateIds", templateIds.toString());
return this.namedjdbcTemplate.query(searchQuery.toString(), new MapSqlParameterSource(queryMap), this.contentRowMapper);
【问题讨论】:
不应该templateIds
是整数的集合而不是字符串?即使字符串解决方案有效,您的解决方案也不会很安全,因为template.getId()
中的任何逗号都会引入虚假值。
是的,正如@biziclop 提到的 - 如果可能的话,尝试使用 int[] 作为参数。
看看这个:***.com/questions/2810418/…
或者这个http://***.com/questions/1981683/how-to-generate-a-dynamic-in-sql-list-through-spring-jdbctemplate
【参考方案1】:
您需要准备一组模板 ID 并将其传递给地图。 字符串分隔的数据可能无法像预期的那样工作。
=========================
List templateIds = new ArrayList();
templateIds.add(template.getId());
----
---
queryMap.put("templateIds", templateIds);
【讨论】:
以上是关于安全地为查询准备逗号分隔列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章