为什么这个Query返回NULL?

时间:2017-02-23 08:36:58

标签: java nullpointerexception prepared-statement derby

我有一个derby用户数据库,当用户点击登录应用程序时,我会查询该数据库。

但是,当我使用参数[user]查询users表时,derby返回一个空Object而不是它应该返回的记录。

这是我的代码:

String ssql = "SELECT * FROM USERS WHERE UNAME LIKE ?";
   try{
       DriverManager.registerDriver(new org.apache.derby.jdbc.EmbeddedDriver());
       con = DriverManager.getConnection(url);
       sql = con.prepareStatement(ssql, Statement.RETURN_GENERATED_KEYS);
       sql.setString(1, cbox_chooseUser.getSelectedItem().toString());
       sql.executeQuery();
       ResultSet rs = sql.getGeneratedKeys();
           try{
              while (rs.next()) {
                 if(rs.getString("PW").toCharArray().equals(txt_password.getPassword())){
                     sql.close();
                     con.close();
                     return true;
                  }
             } catch (NPE ...) {...}
    }

我尝试了多次,测试用户同时将pw和用户名设置为" test&#34 ;;但我总是得到同样的错误。 为什么记录集总是空的?

感谢您的帮助:)

2 个答案:

答案 0 :(得分:4)

documentation

  

ResultSet getGeneratedKeys()抛出SQLException

     

检索由于执行此Statement而创建的任何自动生成的密钥   宾语。

     

如果此Statement对象未生成任何键,则为空   返回ResultSet对象

您的select语句不会生成任何键,这就是它返回空ResultSet的原因。你没有插入任何东西,因此没有生成密钥。

您可以尝试ResultSet rs = sql.executeQuery();。它应该工作。

答案 1 :(得分:1)

你使用的方式错误。

生成的密钥概念只应在insert类型查询的DML情况下使用,但不能在select查询的情况下使用。

select只需从表格中选择行即可。在这种情况下,没有任何密钥生成的可能性。

insert查询的情况下,如果任何列配置为auto increment或某种功能,则会生成一些密钥。可以使用java中的Statement.RETURN_GENERATED_KEYS来捕获这些键。

当您使用select查询时,无需使用Statement.RETURN_GENERATED_KEYS

你只需修改下面的行,一切都会好的。

sql = con.prepareStatement(ssql, Statement.RETURN_GENERATED_KEYS);
sql.setString(1, cbox_chooseUser.getSelectedItem().toString());
sql.executeQuery();
ResultSet rs = sql.getGeneratedKeys();

sql = con.prepareStatement( ssql );
sql.setString( 1, cbox_chooseUser.getSelectedItem().toString() );
ResultSet rs = sql.executeQuery();