在字符串之间添加n-1个逗号

时间:2012-07-17 08:01:32

标签: java collections stringbuilder

我hava再次运行它有趣的问题,我需要动态构建SQL查询,其中包含IN条件。所以我有String列表,我需要将它们插入由昏迷分隔的StringBuilder

所以我的第一个想法是使用一些布尔值来确定我是否应该插入昏迷。

builder.append("TABLE.METACODES in (");
boolean isFirst = true;
for(String metaCode : cto.getEntityMetaCodes()) {
    if(isFirst) {
        isFirst = false;
        builder.append("'" + metaCode + "'");
    } else {
         builder.append(", '" + metaCode + "'");
    }
 }
 builder.append(")");

你能想到更好的解决方案吗?

3 个答案:

答案 0 :(得分:4)

你可以使用StringUtils中的join,这会让最后一个逗号为你想要的结果提供一个很好的结果。

来自文档:

  

将提供的数组的元素连接到单个String中   包含提供的元素列表。

     

在列表之前或之后添加分隔符。空分隔符是   与空字符串(“”)相同。空内对象或空字符串   数组由空字符串表示。

 StringUtils.join(null, *)                = null
 StringUtils.join([], *)                  = ""
 StringUtils.join([null], *)              = ""
 StringUtils.join(["a", "b", "c"], "--")  = "a--b--c"
 StringUtils.join(["a", "b", "c"], null)  = "abc"
 StringUtils.join(["a", "b", "c"], "")    = "abc"
 StringUtils.join([null, "", "a"], ',')   = ",,a"

您可以使用相同的方法:

builder.append("TABLE.METACODES in ('");
boolean isFirst = true;
StringUtils.join(cto.getEntityMetaCodes(),"','");
builder.append("')");

当集合为空时你需要注意,因为使用这种方法,结果将是一个有效的sql:TABLE.METACODES in (''),你的代码将是无效的:TABLE.METACODES in ()

答案 1 :(得分:2)

I need to dynamically build SQL query which contatins the IN condition ..不,不,你真的没有。真的,这在很多层面都很可怕。这些天没有理由为SQL查询操作字符串,只有当你总是得到SQL注入漏洞时,才会让你进入科技媒体。

Hibernate可以使用集合see here轻松完成此操作,我希望普通的PreparedStatements也可以这样做,尽管你可能需要手动构建in子句然后在循环中设置变量之后 - 在这种情况下采用Francisco的方法,但改为使用占位符。

答案 2 :(得分:1)

不使用外部库,我会做类似的事情:

builder.append("TABLE.METACODES in (");
EntityMetaCodes emc = cto.getEntityMetaCodes();
builder.append("'" + emc.remove(0) + "'"); // assuming it's an ArrayList, remove(0) takes out the
                               // first element and moves everything else to the left
for(String metaCode : emc) {
    builder.append(", '" + metaCode + "'");
}
builder.append(")");