安全地为查询准备逗号分隔列表[重复]

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); 

【讨论】:

以上是关于安全地为查询准备逗号分隔列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在逗号分隔的字符串中[重复]

将列表列表(用逗号分隔的语句)展平为列表列表[重复]

检查逗号分隔列表是不是包含特定数字[重复]

逗号分隔的列表正则表达式 [重复]

拆分由逗号分隔的 JSON blob 列表(忽略 JSON blob 中的逗号)[重复]

逗号分隔的字符串列表[重复]