我正在尝试获取它们id
在特定集中的记录列表。我将通过 Web 服务从另一个应用程序中获取此集合。我应该这样写查询:SELECT * FROM tbl_data WHERE id IN (?, ?, ?, ?)
. 但问题是(?, ?, ?, ?)
部分是可变长度的。对于一个请求,它就像:SELECT * FROM tbl_data WHERE id IN (?, ?, ?)
而对于另一个请求,它就像:SELECT * FROM tbl_data WHERE id IN (?, ?, ?, ?, ?, ?)
。我真的不喜欢循环并一一获取记录。有没有办法建立这个查询?
问问题
196 次
3 回答
3
您可以在代码中生成IN
部分查询。如果您知道应该用什么代替? symbol
,您只需运行循环并构建它。
String sqlPart = "(";
for (every symbol but last){
sqlPart += symbol;
sqlPart += ",";
}
sqlPart += lastSymbol;
sqlPart += ")";
String sql = "SELECT * FROM tbl_data WHERE id IN " + sqlPart;
于 2013-05-04T08:11:19.083 回答
2
您可以改为循环并构造 string "?, ?, ? ... , ?"
,只需放置与您必须向 DB 询问的 id 一样多的问号。使用StringBuilder构造字符串
这里有一些示例代码:
@Test
public void genSqlInParameterString() {
String select = "SELECT * FROM my_table WHERE ";
System.out.println(select + genSqlInParameterString(null));
System.out.println(select + genSqlInParameterString(new String[]{}));
System.out.println(select + genSqlInParameterString(new String[]{"A"}));
System.out.println(select + genSqlInParameterString(new String[]{"A", "B"}));
}
public String genSqlInParameterString(String[] args) {
StringBuilder sb = new StringBuilder();
if(args != null && args.length > 0) {
sb.append("IN (");
for(int i = 0; i < args.length ; i++) {
sb.append('\'').append(args[i]).append('\'');
if(i < args.length-1) {
sb.append(", ");
}
}
sb.append(")");
}
if(sb.length() == 0) {
// condition evaluates to false, so that select returns nothing
// you may instead return 1=1 so that all records are returned
// handling no-paramters case depends on your requirements
sb.append("1=0");
}
return sb.toString();
}
输出
SELECT * FROM my_table WHERE 1=0
SELECT * FROM my_table WHERE 1=0
SELECT * FROM my_table WHERE IN ('A')
SELECT * FROM my_table WHERE IN ('A', 'B')
于 2013-05-04T08:11:04.393 回答
2
使用 QueryDSL 或 JOOQ 而不是手动编写 SQL 代码。
于 2013-05-04T08:43:41.557 回答