如何在 Java 查询中使用 SQL 提示

刚刚听说“SQL 提示”可以优化查询结果或键入 SQL 查询时的处理时间。我找到了大量关于如何将这个概念实现到 Hibernate 中的信息,但没有找到关于如何将它与纯 Java 代码一起使用的信息。谁能帮我这个?


我们正在使用以下代码:


String value = "someValueToUseAsFilter";

String query =  "SELECT /*+ opt_param('_optimizer_cost_model','io') opt_param('optimizer_index_cost_adj',20) opt_param('optimizer_index_caching',65) PARALLEL(4)*/ "+

                        " T.field AS table_field "+

                        " FROM table T "+

                        " WHERE T.field = ? "+

                        "/";

ResultSet rs = null;

PreparedStatement stmt = null;

try {

        stmt = this.connection.prepareStatement(query);

        stmt.setQueryTimeout(this.timeout);

        stmt.setString(1, value);

        rs = stmt.executeQuery();

}

catch (Exception e){

        e.printStackTrace();        

}

接下来,eclipse 抛出以下异常:


java.sql.SQLSyntaxErrorException: ORA-00936: missing expression

查询已经过测试,如果直接针对数据库启动,它可以正常工作。但是在代码上使用它时会不断返回此错误。如果这可能的话,任何人都可以解释我吗?如果是这样,我如何在这种情况下使用它?


泛舟湖上清波郎朗
浏览 195回答 1
1回答

凤凰求蛊

这/是一个用于结束和执行语句的客户端指令。您的错误与提示或 Java 无关,您只需要删除尾部斜杠即可。您可以看到以其他方式运行语句的相同效果,例如作为匿名块中的动态 SQL:set serveroutput ondeclare&nbsp; query varchar2(4000);begin&nbsp; query := q'[SELECT /*+ opt_param('_optimizer_cost_model','io') opt_param('optimizer_index_cost_adj',20) opt_param('optimizer_index_caching',65) PARALLEL(4)*/T.field AS table_fieldFROM your_table TWHERE T.field = :var/]';&nbsp; dbms_output.put_line(query);&nbsp; execute immediate query;end;/生成的语句打印为:SELECT /*+ opt_param('_optimizer_cost_model','io') opt_param('optimizer_index_cost_adj',20) opt_param('optimizer_index_caching',65) PARALLEL(4)*/T.field AS table_fieldFROM your_table TWHERE T.field = :var/带有尾部斜杠,正如您所说,它将直接在客户端/IDE 中运行;但execute immediate得到与您相同的错误:ORA-00936: missing expressionORA-06512: at line 12斜线被纯粹视为一个除法符号,因此它期待之后的另一个表达式 - 使该子句WHERE T.field = :var / <something>。如果删除斜杠:declare&nbsp; query varchar2(4000);begin&nbsp; query := q'[SELECT /*+ opt_param('_optimizer_cost_model','io') opt_param('optimizer_index_cost_adj',20) opt_param('optimizer_index_caching',65) PARALLEL(4)*/T.field AS table_fieldFROM your_table TWHERE T.field = :var]';&nbsp; dbms_output.put_line(query);&nbsp; execute immediate query using 42;end;/生成的语句现在没有它(显然),并且您没有收到错误:PL/SQL procedure successfully completed.(我应该选择到的东西-查询在这里仅分析,不会执行,但不要紧,这个例子)。请注意,语句末尾也不需要分号,因为它是语句分隔符;添加一个会导致不同的错误,如 ORA-00911 无效字符。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java