我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(")");
你能想到更好的解决方案吗?
答案 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(")");