2017-06-20 18 views
0

Oracleにレコードを挿入しようとしています。シーケンスID(そのテーブルのプライマリキー)私はSOのリンクの周りでグーグルといくつかのコードスニペットを見つけて、それらを試しているが、私はエラーを次のOracle DBにレコードを挿入中に見ている。SpringのJdbcTemplateを使用してDBに挿入された最後のシーケンスIDを取得できません

エラー

Exception in thread "main" org.springframework.dao.DataRetrievalFailureException: The generated key is not of a supported numeric type. Unable to cast [oracle.sql.ROWID] to [java.lang.Number] 
    at org.springframework.jdbc.support.GeneratedKeyHolder.getKey(GeneratedKeyHolder.java:73) 
    at com.ebayenterprise.publicapi.events.dao.DBConnectionUtils.insertEventLogData2(DBConnectionUtils.java:88) 
    at com.ebayenterprise.publicapi.events.dao.DBConnectionUtils.main(DBConnectionUtils.java:42) 

プログラム方法

private static void insertEventLogData2() { 
     //setup data 
     EventType eventType = new EventType(EVENT_TYPE_ID, EVENT_TYPE_CD, null, null); 
     Timestamp currentTimestamp = new Timestamp(System.currentTimeMillis()); 
     final EventLog eventLog = new EventLog(eventType, ROUTE_ID, ORDER_ID, null, null, currentTimestamp, currentTimestamp); 
     System.out.println("eventLog = " + eventLog); 

     //execute query 
     GeneratedKeyHolder holder = new GeneratedKeyHolder(); 
     jdbcTemplate.update(new PreparedStatementCreator() { 
      @Override 
      public PreparedStatement createPreparedStatement(Connection con) throws SQLException { 
       PreparedStatement statement = con.prepareStatement(INSERT_EVENT_LOG_MESSAGE_SQL, Statement.RETURN_GENERATED_KEYS); 
       statement.setInt(1, eventLog.getRouteId()); 
       statement.setInt(2, eventLog.getEventType().getEventTypeId()); 
       statement.setString(3, eventLog.getOrderId()); 
       statement.setTimestamp(4, eventLog.getIncomingEventTimestamp()); 
       statement.setTimestamp(5, eventLog.getOutgoingEventTimestamp()); 
       return statement; 
      } 
     }, holder); 

     //get the sequence key 
     long generatedEventId = holder.getKey().longValue(); 
     System.out.println("generatedEventId = " + generatedEventId); 
    } 

表内容:

EVENT_ID (Primary Key - Mapped to sequence EVENT_ID_SEQ) 
ROUTE_ID 
EVENT_TYPE_ID 
ORDER_ID 
INCOMING_EVENT_TIMESTAMP 
OUTGOING_EVENT_TIMESTAMP 

答えて

0

気にしません。 NamedParameterJdbcTemplateを使って作業しました。よりクリーンな実装も同様です。

private static final String INSERT_EVENT_LOG_MESSAGE_SQL2 = "INSERT INTO " 
     + "EVENT_LOG (EVENT_ID, ROUTE_ID, EVENT_TYPE_ID, ORDER_ID, INCOMING_EVENT_TIMESTAMP, OUTGOING_EVENT_TIMESTAMP) " 
     + "VALUES (EVENT_LOG_ID_SEQ.NEXTVAL, :routeId, :eventTypeId, :orderId, :incomingEventTS, :outgoingEventTS)"; 


private static void insertEventLogData() { 
     //setup data 
     EventType eventType = new EventType(EVENT_TYPE_ID, EVENT_TYPE_CD, null, null); 
     Timestamp currentTimestamp = new Timestamp(System.currentTimeMillis()); 
     EventLog eventLog = new EventLog(eventType, ROUTE_ID, ORDER_ID, null, null, currentTimestamp, currentTimestamp); 
     System.out.println("eventLog = " + eventLog); 

     MapSqlParameterSource parameters = new MapSqlParameterSource(); 
     parameters.addValue("routeId", ROUTE_ID); 
     parameters.addValue("eventTypeId", EVENT_TYPE_ID); 
     parameters.addValue("orderId", ORDER_ID); 
     parameters.addValue("incomingEventTS", currentTimestamp); 
     parameters.addValue("outgoingEventTS", currentTimestamp); 

     GeneratedKeyHolder holder = new GeneratedKeyHolder(); 
     int nb = namedJdbcTemplate.update(INSERT_EVENT_LOG_MESSAGE_SQL2, parameters, holder, new String[]{"EVENT_ID"}); 

     //get the sequence key 
     long generatedEventId = holder.getKey().longValue(); 
     System.out.println("generatedEventId = " + generatedEventId); 
    } 
関連する問題