Java 从资源文件为SQL PreparedStatement生成字符串参数(包含SQL内容)

Java 从资源文件为SQL PreparedStatement生成字符串参数(包含SQL内容),java,sql,jdbc,prepared-statement,Java,Sql,Jdbc,Prepared Statement,我需要使用jdbc在Java中执行SQL PreparedStatement。 我面临其中一个参数的问题,因为它包含SQL内容,还包含来自资源文件的字符串。 它看起来像这样: 必需的SQL: SELECT * FROM Table T WHERE T.value = 10 ? 从表T中选择*,其中T.value=10,T.display IN('Sample1','Sample2') 在上面的查询中,Sample1和Sample2值必须通过参数传递给PreparedStatement Prep

我需要使用jdbc在Java中执行SQL PreparedStatement。 我面临其中一个参数的问题,因为它包含SQL内容,还包含来自资源文件的字符串。 它看起来像这样:

必需的SQL:

SELECT * FROM Table T WHERE T.value = 10 ?
从表T中选择*,其中T.value=10,T.display IN('Sample1','Sample2')

在上面的查询中,
Sample1
Sample2
值必须通过参数传递给PreparedStatement

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等

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

将此用作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...
String generateParamString(int参数){
StringBuilder sb=新的StringBuilder(“”);
对于(int i=1;i
占位符
只能在查询中需要值的位置使用。在任何其他位置使用
(如在您的问题中:
其中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
    }
}
StringBuilder sb=新的StringBuilder(
“从表T中选择*,其中T.值=10,T.显示在(?);
//注意:有意从1开始,第一个参数已经在上面
//假设始终至少有一个参数
而(int i=1;i
请参见问题中的编辑。这些字符串不一定只有两个。所以硬编码
(?,?)
不是一个选项。@naren.katneni好吧,如果硬编码不是一个选项-创建
(?,?,?…)
字符串dynamically@naren.katneni您的示例字符串来自哪里?数组、列表、集合或其他内容?@jlordo它们是否存储在从XML文件生成的列表中。您能否详细说明一下“但是这不会返回适当的结果”?查询不会被拒绝,但是,问题似乎在于参数中添加了双引号。您可能需要指定正在使用的数据库,并打印生成的sqlstatement@Amine我认为不可能检查生成的SQL。