Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在字符串之间添加n-1个逗号_Java_Collections_Stringbuilder - Fatal编程技术网

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

Java 在字符串之间添加n-1个逗号,java,collections,stringbuilder,Java,Collections,Stringbuilder,我又运行了一个有趣的问题,我需要动态地构建包含条件的SQL查询。所以我有一个字符串列表,我需要将它们插入到我的StringBuilder中,以逗号分隔 所以我的第一个想法是使用一些布尔值来确定是否应该插入昏迷 builder.append("TABLE.METACODES in ("); boolean isFirst = true; for(String metaCode : cto.getEntityMetaCodes()) { if(isFirst) { isFir

我又运行了一个有趣的问题,我需要动态地构建包含条件的SQL查询。所以我有一个字符串列表,我需要将它们插入到我的
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(")");

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

你可以使用
join
from,这会让最后一个逗号出来,给出一个很好的结果

从文件:

将所提供数组的元素合并为单个字符串 包含提供的元素列表

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

您可以使用相同的方法:

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

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

您可以使用
join
from,这将使最后一个逗号为您提供一个满意的结果

从文件:

将所提供数组的元素合并为单个字符串 包含提供的元素列表

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

您可以使用相同的方法:

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

当集合为空时,您需要注意,因为使用这种方法,结果将是一个有效的sql:
TABLE.METACODES in(“”)
,而您的代码将是无效的:
TABLE.METACODES in()
我需要动态构建包含in条件的sql查询。。不,不,你真的不知道。真的,这在很多层面上都很可怕。现在没有理由为SQL查询操作字符串,这只会让你在总是受到SQL注入攻击的情况下进入技术领域


Hibernate可以轻松地在集合中实现这一点,我希望普通的PreparedStatements也能做到这一点,尽管您可能需要手动构建in子句,然后在循环中设置变量——在这种情况下,采用Francisco的方法,但使用占位符。

我需要动态构建包含in条件的SQL查询。。不,不,你真的不知道。真的,这在很多层面上都很可怕。现在没有理由为SQL查询操作字符串,这只会让你在总是受到SQL注入攻击的情况下进入技术领域


Hibernate可以很容易地用集合实现这一点,我希望普通的PreparedStatements也能做到这一点,尽管您可能需要手动构建in子句,然后在循环中设置变量——在这种情况下,采用Francisco的方法,但使用占位符代替。

不使用外部库,我会这样做:

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

如果不使用外部库,我会执行以下操作:

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

如果可以的话,我会这么做,我有自己的理由这么做(我需要使用Oracles分区,所以我不能使用Criteria API,参数可以变化,所以我不能使用NamedQueries),但是嘿,在这种情况下你是对的,这个参数将一直存在,我没有意识到。Thanks@PetrHibernate(它的一个端口…)应该支持分片和协同,所以我认为这也适用于oracle分区,但从未使用过oracle,所以我不知道。无论如何,您至少可以使用Francisco的方法构建preparedstatement,并让JDBC驱动程序完成SQL规范化。仍然有点混乱,但给了你安全性。如果可以的话,我会这样做,我有我自己的理由这样做(我需要使用Oracles分区,所以我不能使用Criteria API,参数可以变化,所以我不能使用NamedQueries),但是嘿,在这种情况下你是对的,这个参数将始终存在,我没有意识到。Thanks@PetrHibernate(它的一个端口…)应该支持分片和协同,所以我认为这也适用于oracle分区,但从未使用过oracle,所以我不知道。无论如何,您至少可以使用Francisco的方法构建preparedstatement,并让JDBC驱动程序完成SQL规范化。仍然有点混乱,但给了您安全性。感谢您的提示,但不幸的是我们没有使用Apache Commons。如果您没有使用,我建议您使用方法创建一个Helper类;)也许可以看看Apache Commons代码。。。它已经优化了。您可以在这里查看:行:3370(可能只是将方法按原样提取到您的helper类)感谢您的提示,但不幸的是,我们没有使用Apache Commons。如果您没有使用,我建议您使用该方法创建一个helper类;)也许可以看看Apache Commons代码。。。它已经优化了。你可以在这里看一看:行:3370(可能只是将方法提取到你的助手类中)好主意,我最喜欢这个解决方案:)好主意,我最喜欢这个解决方案:)