查询在SQLDeveloper中工作,但在JDBC

时间:2016-03-17 23:50:42

标签: java sql jdbc oracle11g oracle-sqldeveloper

我有以下查询:

SELECT MAX(ID) FROM INGRESO_SALIDA_BUQUES WHERE ID_BUQUE = 1;

在SQLDeveloper中执行时有效。它返回一行,只返回一列:ID_BUQUE = 1的最大ID。

现在,我正在使用jdbc连接到数据库并执行相同的操作。这是代码:

String sql = "SELECT MAX(ID) AS MAXIMO FROM INGRESO_SALIDA_BUQUES ";
    sql += "WHERE ID_BUQUE = " + registroSalida.getIdBuque();

PreparedStatement prepStmt = conn.prepareStatement(sql);
    recursos.add(prepStmt);
    ResultSet rs = prepStmt.executeQuery();

代码的las行是抛出错误的代码。

eclipse控制台的结果(供您参考“Nombre de columnanoválido”表示无效的列名称):

18:40:27,712 ERROR [stderr] (default task-2) SQLException:Nombre de columna no válido
18:40:27,712 ERROR [stderr] (default task-2) java.sql.SQLException: Nombre de columna no válido
18:40:27,713 ERROR [stderr] (default task-2)    at oracle.jdbc.driver.OracleStatement.getColumnIndex(OracleStatement.java:3724)
18:40:27,713 ERROR [stderr] (default task-2)    at oracle.jdbc.driver.OracleResultSetImpl.findColumn(OracleResultSetImpl.java:2799)
18:40:27,713 ERROR [stderr] (default task-2)    at oracle.jdbc.driver.OracleResultSet.getString(OracleResultSet.java:498)

我尝试删除除1之外的所有行,以便在我将MAX(ID)更改为ID 时看到帽子会发生。此查询有效。我再次尝试MAX(ID)只有一行,它又失败了。

该表是使用以下代码创建的:

CREATE TABLE INGRESO_SALIDA_BUQUES (
    ID NUMBER,
    ID_BUQUE NUMBER NOT NULL,
    FECHA_INGRESO DATE NOT NULL,
    FECHA_SALIDA DATE,
    CONSTRAINT PK_ISB PRIMARY KEY (ID),
    CONSTRAINT FK_ISB_ID_BUQUE FOREIGN KEY (ID_BUQUE) REFERENCES BUQUE(ID));

你知道如何解决这个问题吗?

recursos只是一个ArrayList:

private ArrayList<Object> recursos;

在构造函数中我初始化它。     recursos = new ArrayList();

我用它来保存SQL语句所需的资源,以便以后关闭它们。

关闭它们的方法是:

public void cerrarRecursos() {
    for(Object ob : recursos){
        if(ob instanceof PreparedStatement)
            try {
                ((PreparedStatement) ob).close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
    }
}

1 个答案:

答案 0 :(得分:3)

堆栈跟踪显示错误来自

oracle.jdbc.driver.OracleResultSet.getString(OracleResultSet.java:498)

...所以它是从rs.getString()电话中筹集的,而不是您认为来自的prepStmt.executeQuery()

由于您说如果您将查询更改为ID而不是MAX(ID),则说明它有效,您显示的代码正在执行rs.getString("ID") - 否则它仍然会失败在那之后改变。如果您在getString中使用列名称,那么它必须与查询中的列别名匹配。

您可以更改结果集处理以执行rs.getString("MAXIMO")以使用您在查询中显示的别名,或rs.getString(1)使用位置表示法;或将查询别名从MAXIMO更改为ID