Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从内存中的Derby数据库表中选择数据?_Java_Select_Derby_Javadb_In Memory Database - Fatal编程技术网

Java 如何从内存中的Derby数据库表中选择数据?

Java 如何从内存中的Derby数据库表中选择数据?,java,select,derby,javadb,in-memory-database,Java,Select,Derby,Javadb,In Memory Database,我已经使用JavaDB/Derby创建了一个内存中的数据库表。我可以将数据插入表中。但是当我尝试从表中选择数据时,它不起作用 I创建具有以下内容的表: DECLARE GLOBAL TEMPORARY TABLE SESSION.memtable (id int, name varchar(10)) NOT LOGGED 插入带有以下内容的数据: INSERT INTO SESSION.memtable (id, name) VALUES (?,?) SELECT name FROM SES

我已经使用JavaDB/Derby创建了一个内存中的数据库表。我可以
数据插入表中。但是当我尝试从表中选择数据时,它不起作用

I创建具有以下内容的表:

DECLARE GLOBAL TEMPORARY TABLE SESSION.memtable (id int, name varchar(10))
NOT LOGGED
插入带有以下内容的数据:

INSERT INTO SESSION.memtable (id, name) VALUES (?,?)
SELECT name FROM SESSION.memtable WHERE id = ?
对于受影响的
行,它返回
1
。I选择带有以下内容的数据:

INSERT INTO SESSION.memtable (id, name) VALUES (?,?)
SELECT name FROM SESSION.memtable WHERE id = ?
但是它返回一个空的
结果集
rs.next()
为false)

使用
选择
时我做错了什么

我使用JDK7中包含的
derby.jar

这是我的密码:

public class DBTest {
    public static void main(String[] args) {
        final int userId = 4;
        final String sql = "DECLARE GLOBAL TEMPORARY TABLE SESSION.memtable "+
                            "(id int, name varchar(10)) NOT LOGGED";
        final String inSQL = "INSERT INTO SESSION.memtable (id, name) "+
                             "VALUES (?,?)";
        final String selSQL = "SELECT name FROM SESSION.memtable WHERE id = ?"
        final String connURL = "jdbc:derby:memory:memdatabase;create=true";
        try(Connection conn = DriverManager.getConnection(connURL);) {
            try (PreparedStatement ps = conn.prepareStatement(sql);) {
                ps.execute();
            }
            try (PreparedStatement ps = conn.prepareStatement(inSQL);) {
                ps.setInt(1, userId);
                ps.setString(2, "Jonas");
                int rows = ps.executeUpdate();
                System.out.println(rows + " rows inserted.");
            }
            try (PreparedStatement ps = conn.prepareStatement(selSQL);) {
                ps.setInt(1, userId);
                try (ResultSet rs = ps.executeQuery();) {
                    String name;
                    if(rs.next()) {
                        name = rs.getString("name");
                    } else {
                        name = null;
                    }
                    System.out.println("Name: " + name);
                }
            }
        } catch (SQLException e) {e.printStackTrace();}}}
更新

如果我将SELECT查询更改为:

SELECT t1.name AS name FROM SESSION.memtable t1 WHERE id = ?
我收到以下错误消息:

java.sql.SQLException: Operation 'DROP TABLE' cannot be performed on object 'MEMTABLE(ID, NAME)' because there is an open ResultSet dependent on that object.
    at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedConnection.commitIfAutoCommit(Unknown Source)
    at org.apache.derby.impl.jdbc.ConnectionChild.commitIfAutoCommit(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedStatement.resultSetClosing(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedResultSet.movePosition(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedResultSet.next(Unknown Source)
    at DBTest.main(DBTest.java:29)
Caused by: java.sql.SQLException: Operation 'DROP TABLE' cannot be performed on object 'MEMTABLE(ID, NAME)' because there is an open ResultSet dependent on that object.
    at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown Source)
    ... 11 more
Caused by: ERROR X0X95: Operation 'DROP TABLE' cannot be performed on object 'MEMTABLE(ID, NAME)' because there is an open ResultSet dependent on that object.
    at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
    at org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.verifyNoOpenResultSets(Unknown Source)
    at org.apache.derby.impl.sql.GenericPreparedStatement.prepareToInvalidate(Unknown Source)
    at org.apache.derby.impl.sql.depend.BasicDependencyManager.coreInvalidateFor(Unknown Source)
    at org.apache.derby.impl.sql.depend.BasicDependencyManager.invalidateFor(Unknown Source)
    at org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.tempTablesAndCommit(Unknown Source)
    at org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.doCommit(Unknown Source)
    at org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.userCommit(Unknown Source)
    at org.apache.derby.impl.jdbc.TransactionResourceImpl.commit(Unknown Source)
    ... 6 more

但是
Name:
没有打印出来,所以它仍然不起作用。

您应该仔细研究一下Hibernate。它不仅映射您的类,而且还为您管理讨厌的JDBC内容,以便您能够专注于您想要完成的事情。它远非完美,但除此之外,它还提供了数据库的可移植性

我在Spring中使用hibernate,因此我的代码如下所示:

TempStorage temp = new TempStorage();
temp.setName("Bob");
getHibernateTemplate.insert(temp);
temp = getHibernateTemplate.find("SELECT name FROM TempStorage");

邮件列表中讨论了这个问题,其中提到了在提交保留行中包含
的附加要求。


启用自动提交时,默认情况下,临时表在提交时被清除,因此extra子句确保在事务提交之后,行保持可用。

这里使用两个概念,一个是带内存存储选项的Derby,另一个是临时表。如果您想要一个内存数据库,您仍然可以使用常规定义的表(“创建表…”)。这将使它变得更容易,因为您不必处理这些临时表的会话语义。

Hibernate不是我要找的东西,我不知道如何解决我的问题。使用Hibernate将帮助您避免陷入数据库语言的特性中。尽管它添加了一些自己的。请解释Hibernate如何解决我的问题,并发布一些代码。如何从在Hibernate中工作的内存中derby数据库中编写select查询?我怀疑这甚至不可能在Hibernate+derby中实现。