Java 从资源文件为SQL PreparedStatement生成字符串参数(包含SQL内容)
我需要使用jdbc在Java中执行SQL PreparedStatement。 我面临其中一个参数的问题,因为它包含SQL内容,还包含来自资源文件的字符串。 它看起来像这样: 必需的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
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。