0

我正在尝试获取它们id在特定集中的记录列表。我将通过 Web 服务从另一个应用程序中获取此集合。我应该这样写查询:SELECT * FROM tbl_data WHERE id IN (?, ?, ?, ?). 但问题是(?, ?, ?, ?)部分是可变长度的。对于一个请求,它就像:SELECT * FROM tbl_data WHERE id IN (?, ?, ?)而对于另一个请求,它就像:SELECT * FROM tbl_data WHERE id IN (?, ?, ?, ?, ?, ?)。我真的不喜欢循环并一一获取记录。有没有办法建立这个查询?

4

3 回答 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 回答