查询在 SQLDeveloper 中有效,但在 JDBC 中无效
Query works in SQLDeveloper but not in JDBC
我有以下查询:
SELECT MAX(ID) FROM INGRESO_SALIDA_BUQUES WHERE ID_BUQUE = 1;
当我在 SQLDeveloper 中执行它时有效。它 returns 一行,只有一列: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();
最后一行代码是抛出错误的那一行。
eclipse控制台的结果(供您参考"Nombre de columna no vá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) 只有一行,但再次失败。
table 已使用此代码创建:
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();
}
}
}
堆栈跟踪显示错误来自
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
.
我有以下查询:
SELECT MAX(ID) FROM INGRESO_SALIDA_BUQUES WHERE ID_BUQUE = 1;
当我在 SQLDeveloper 中执行它时有效。它 returns 一行,只有一列: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();
最后一行代码是抛出错误的那一行。
eclipse控制台的结果(供您参考"Nombre de columna no vá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) 只有一行,但再次失败。
table 已使用此代码创建:
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();
}
}
}
堆栈跟踪显示错误来自
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
.