2017-12-03 7 views
1

私はHSQLDB - 試し版2.3.4と2.4を使用しています。行が挿入されていてもGetGeneratedKeysは機能しません

私はこのJavaコードを持っている:

  String sqlquery = "MERGE INTO bewertung pu USING " 
      .concat("(VALUES ?,?,?) ") 
      .concat("temp (tid,jurorid,runde) ") 
      .concat("ON temp.tid = pu.tid and temp.jurorid=pu.jurorid and temp.runde=pu.runde ") 
      .concat("WHEN NOT MATCHED THEN ") 
      .concat("INSERT (tid,jurorid,runde) ") 
      .concat("VALUES (temp.tid,temp.jurorid,temp.runde)"); 

     PreparedStatement preparedStatement = sql.getConnection().prepareStatement(sqlquery, 
             Statement.RETURN_GENERATED_KEYS);    


     preparedStatement.setInt(1, eineBewertung.getTanzID()); //TID 
     preparedStatement.setInt(2, eineBewertung.getJurorID()); //JURORID 
     preparedStatement.setInt(3, eineBewertung.getRunde()); //RUNDE 

     int rowsAffected = preparedStatement.executeUpdate();   

     if (rowsAffected == 0) { 
      //UPDATE 
      //DO SOMETHING 
     }else{ 
      //INSERT 
      try (ResultSet rs = preparedStatement.getGeneratedKeys()) { 
       if (rs.next()) {  
        eineBewertung.setBewertungsid(rs.getInt(1)); 
       } 
      }catch (SQLException ex) { 
       this.controller.error_ausgeben(ex); 
      } 
     } 

それは動作します。新しい行を挿入すると、私はrowsAffected = 1になります。データベースをチェックして、挿入が機能しました。

しかし、結果セットには何も戻っていません。getGeneratedKeys() いつも空です。

Statement.RETURN_GENERATED_KEYSを主キーに置き換えるヒントをいくつか見つけました。しかし、これは私のために働かなかった。

PreparedStatement preparedStatement = sql.getConnection().prepareStatement(sqlquery, 
            new String[]{"BEWERTUNGSID"}); 

これは私がテーブルを作成する方法である:

  statement.execute("create table PUBLIC.BEWERTUNG" 
       .concat("(BEWERTUNGSID INTEGER IDENTITY,") 
       .concat("TID INTEGER FOREIGN KEY REFERENCES Tanz(Tanzid),") 
       .concat("JURORID INTEGER not null FOREIGN KEY References JUROR(JURORID),") 
       .concat("RUNDE INTEGER not null,") 
       .concat("primary key(BEWERTUNGSID)") 
       .concat(")")); 

は、なぜ私が戻って任意の生成されたキーを取得しませんか?ありがとうございます

// EDIT 私は、挿入ステートメントで自分のsqlqueryを置き換える場合、それは動作しています。

  sqlquery = "INSERT INTO BEWERTUNG(TID, JURORID, RUNDE) VALUES(22, 2, 2)";  

はなぜmerge sqlqueryのでは動作しませんか?

答えて

1

バージョン2.4.0までのHSQLDBでは、MERGE文を使用してデータを挿入するときに生成されたキーを使用できません。コードは、次のバージョンでこれを可能にするためにコミットされています。

関連する問題