-1

我需要使用 jdbc 在 Java 中执行 SQL PreparedStatement。我遇到了其中一个参数的问题,因为它具有 SQL 内容以及来自资源文件的字符串。它看起来像这样:

所需的 SQL:

SELECT * FROM Table T WHERE T.value = 10 AND T.display IN ('Sample1', 'Sample2')

在上述查询中,Sample1andSample2值必须通过参数传递给 PreparedStatement。

准备好的声明:

SELECT * FROM Table T WHERE T.value = 10 ?

在我的应用程序代码中,我正在设置如下参数:

statement.setString(1, "AND T.display IN ('Sample1', 'Sample2')");

但是,这不会返回适当的结果。

考虑到它也有 SQL 内容和字符串,有没有更好的方法来构建这个特定的参数?

编辑: Sample1, Sample2等是在运行时从外部文件中检索的字符串,每次可以有不同数量的这些字符串。即只能有一个字符串Sample1或多个字符串Sample1, Sample2, Sample3, etc.

EDIT2: 正在使用的数据库是 Oracle。

4

2 回答 2

2

?占位符只能用在查询中预期值的位置。在?任何其他位置(如您的问题WHERE T.value = 10 ?:)只是一个语法错误。

换句话说:不可能像您尝试做的那样对查询本身的一部分进行参数化;您只能参数化值。如果您需要添加动态数量的参数,则需要通过添加所需数量的参数并使用setString(). 例如:

StringBuilder sb = new StringBuilder(
     "SELECT * FROM Table T WHERE T.value = 10 AND T.display IN (?");
// Note: intentionally starting at 1, first parameter already above
// Assuming always at least 1 parameter
while (int i = 1; i < params.length; i++) {
    sb.append(", ?");
}
sb.append(')');

try (
    PreparedStatement pstmt = con.prepareStatement(sb.toString())
) {
    for (int i = 0; i < params.length; i++) {
        pstmt.setString(i + 1, params[i]);
    }
    try (
        ResultSet rs = pstmt.executeQuery();
    ) {
        // Use resultset
    }
}
于 2013-07-25T17:30:49.727 回答
1

将此用作 PreparedStatement

"SELECT * FROM Table T WHERE T.value = 10 AND T.display IN (?, ?);"

然后打电话

statement.setString(1, "Sample1");
statement.setString(2, "Sample2");

在执行语句之前。


更新:

String generateParamString(int params) {
    StringBuilder sb = new StringBuilder("(");
    for (int i = 1; i < params; i++) {
        sb.append("?, ");
    }
    sb.append("?)");
    return sb.toString();
}

List<String> samples = ... // your list with samples.
String stmtString = "SELECT * FROM Table T WHERE T.value = 10 AND T.display IN "
    + generateParamString(samples.size());
// generate statement with stmtString 
for (int i = 0; i < samples.size(); i++) {
    statement.setString(i + 1, samples.get(i));
}
// execute statement...
于 2013-07-25T16:53:28.083 回答