这是我的数据库。
dragons
id, key, name, age, creation_date
users
id, name, user, pass
users_dragons
user_id, dragon_id
这是我的代码,用于删除数据库中的龙,这些龙的键值大于所传递的键值,并且属于一个确定的用户。SQL查询可以完美地删除它们,但不能返回被删除元素的键数组。
我尝试使用 PreparedStatement
但后来我查了一下,据我所知,这个类是不返回数组的,而这个类的 CallableStatement
只用于执行db中的进程,我不知道它们是如何返回数组的。
String query = "" +
"DELETE FROM dragons " +
"WHERE id IN (SELECT d.id FROM dragons d, users u, users_dragons ud" +
" WHERE d.key > ?" +
" AND ud.dragon_id = d.iD" +
" AND ud.user_id in (select id from users where id = ?)) RETURNING key INTO ?";
CallableStatement callableStatement = connection.prepareCall(query);
int pointer = 0;
callableStatement.setInt(++pointer, key);
callableStatement.setInt(++pointer, credentials.id);
callableStatement.registerOutParameter(++pointer, Types.INTEGER);
callableStatement.executeUpdate();
return (int []) callableStatement.getArray(1).getArray();
这段代码给我带来了错误,但很明显,因为CallableStatement需要一个postgres函数来运行,而不是一个简单的SQL查询。
org.postgresql.util.PSQLException: This statement does not declare an OUT parameter.
Use { ?= call ... } to declare one.
at org.postgresql.jdbc.PgCallableStatement.registerOutParameter
.......
这将是非常有帮助的,如何将正确的JDBC算法从数据库中删除元素,并返回删除项的键数组。
你把这样的语句当作一个普通的 SELECT
声明:使用 java.sql.PreparedStatement.executeQuery()
或 java.sql.Statement.executeQuery(String sql)
来执行语句并得到一个结果集。
java.sql.CallableStatement
是用来调用程序的(但在PostgreSQL中你不需要它)。