2017-08-14 41 views
1

我做的语句:结果集不可更新

Statement statement = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); 
try(ResultSet results = statement.executeQuery(String.format("SELECT id, id2 FROM SETTINGS WHERE instance3 = %s, instance.getId()))); 

但我得到这个:

com.mysql.cj.jdbc.exceptions.NotUpdatable:结果集不可更新(被引用的表没有主键)。此结果集必须从使用结果集类型ResultSet.CONCUR_UPDATABLE创建的语句中获得comd,查询必须选择一个表,不能使用函数并且必须从该表中选择所有主键。

任何想法为什么会发生这种情况?

+1

的可能重复:https://stackoverflow.com/questions/22271475/jdbc-deleting-an-entry-primary-keys-concur-updatable-issues – tima

+1

为什么你使用'String.format'为设置参数值?这是不安全的,并向您打开SQL注入。 –

+1

异常消息非常明确,您选择的表没有主键(或者您未选择所有主键列)。请在您的问题中包含所有相关的DDL。 –

回答

-1

您正在创建一个允许结果集可更新的语句。默认的ResultSet对象不可更新,并且只有一个向前移动的游标。所以你需要使用下面的代码片段,其中con是一个有效的Connection对象。它演示了如何创建一个可滚动且不被其他人更新的结果集,并且这是可更新的。

来自:http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html

您可以更从上面的源文件链接,参阅。

PreparedStatement prepStmt= conn.prepareStatement(query, 
    ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); 
+1

你真的读过这个问题吗,create语句具有相同的属性:'createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE)' –