【问题标题】:Regular expression to replace a value in query parameter in java正则表达式替换java中查询参数中的值
【发布时间】:2014-01-12 11:01:51
【问题描述】:

我正在编写一个应用程序来搜索表单中的特定字段并将相应的查询显示给用户(用户可以保存执行的查询并稍后加载查询)。我正在使用 API 根据所选字段生成查询。 API 以以下格式返回生成的查询。

生成的查询

SELECT T0."id" AS "COL0" 
FROM   student_table T0 
WHERE  ( ( ( T0."student_name" = ? ) 
           AND ( T0."grade" = ? ) ) 
         AND ( T0."student_no" LIKE ? ) ) 

预期查询

SELECT T0."id" AS "COL0" 
FROM   student_table T0 
WHERE  ( ( ( T0."student_name" = 'John' ) 
           AND ( T0."grade" = 'A' ) ) 
         AND ( T0."student_no" LIKE '12%' ) ) 

现在我必须从上面的查询中构建正确的查询。由于我在 from 中有字段值,我想替换“?”具有相应的值。

是否可以替换“?”使用java字符串replaceAll方法对应的字段值?我们可以使用反向引用的概念将问号替换为相应的值吗?如果无法使用正则表达式,请提出更好的方法来解决问题。


编辑

我认为准备好的语句不会有太大帮助,因为我需要为数百个无序字段自动执行此过程,而且这也是一项非常昂贵的操作。 (如果我错了,请纠正我)

我实际上使用的是我公司特定的平台 API,我将条件和查询列添加到查询定义中,它以上述格式返回执行的查询。用户应该能够保存预期查询,我应该在 UI 中显示查询和查询结果。

【问题讨论】:

标签: java sql regex oracle11g matcher


【解决方案1】:

尝试按以下方式执行查询

  String insertTableSQL = "SELECT T0.\"ID\" AS \"COL0\" FROM STUDENT_TABLE T0 WHERE ( ( ( T0.\"STUDENT_NAME\" =  ?  ) AND ( T0.\"GRADE\" =  ?  ) ) AND ( T0.\"STUDENT_NO\" LIKE  ?  ) )";               
             PreparedStatement preparedStatement = dbConnection.prepareStatement(insertTableSQL);

            preparedStatement.setString(1, "John");
            preparedStatement.setString(2, "A");
            preparedStatement.setString(3, "12%");
            preparedStatement.execute();

【讨论】:

  • 正如 OP 所说,他已经构建了查询。他只想知道如何执行这个查询。所以我提供了它:)
  • 我认为他需要使用值构建查询。因此,如果我们看到构建代码,我们可以建议如何设置值。
  • OP 说,“我正在编写一个应用程序来搜索表单中的特定字段。我正在使用 API 来根据所选字段生成查询。api 在下面返回生成的查询格式。”所以我不认为他想创建查询。他想换什么?具有适当的价值
【解决方案2】:

您可以使用 PreparedStatement 执行包含 ?

的此类查询
PreparedStatement ps = null;
ResultSet rs = null;

String sQuery = "SELECT T0."ID" AS "COL0" FROM STUDENT_TABLE T0 WHERE ( ( ( T0."STUDENT_NAME" = ? ) AND ( T0."GRADE" = ? ) ) AND ( T0."STUDENT_NO" LIKE ? ) )";

ps = objConnection.prepareStatement(sQuery);
ps.setString(1, valueOf_T0."STUDENT_NAME");
ps.setString(2, valueOf_T0."GRADE");
ps.setString(3, valueOf_T0."STUDENT_NO");
rs = ps.executeQuery();

因为你有数据值并且你知道数据库字段的类型,所以你可以根据你的数据类型在setter方法中设置值,比如setInt(), setDouble()等。

阅读更多:http://docs.oracle.com/javase/6/docs/api/java/sql/PreparedStatement.html

谢谢

【讨论】:

    猜你喜欢
    • 2016-03-24
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    相关资源
    最近更新 更多