2017-03-02 41 views
2

我有一個java實體具有Date類型的屬性,我有一個數據庫表,它將date屬性存儲到bigint cloumn,但是當我運行代碼時它給了我這個錯誤:Cassandra拋出CodecNotFoundException [bigint <-> java.util.Date]

com.datastax.driver.core.exceptions.CodecNotFoundException: Codec not found for requested operation: [bigint <-> java.util.Date]

你能幫助我的例外cassandra是拋出和解決方案嗎?

回答

2

要插入java.util.Date到BIGINT列,這就是爲什麼你得到這個錯誤。

使用getTime()方法獲取以毫秒爲單位的時間,這是很長的時間才能嵌入到bigint列中。

例子:

Date date = ; // you have the date 
long timeInMilis = date.getTime(); 

使用timeInMilis插入到卡桑德拉

可以列bigint類型更改爲時間戳,那麼你就可以直接插入java.util.Date,不必讓時間以毫秒爲單位,

------------------------------------- 
| CQL3 data type | Java type | 
|-------------------|----------------| 
|  bigint  | long  | 
|-------------------|----------------| 
| timestamp  | java.util.Date | 
-------------------------------------- 

來源:http://docs.datastax.com/en/developer/java-driver/3.1/manual/

+0

,所以你的意思是說長型可以在BIGINT列 –

+0

是的,這裏是更多詳細信息HTTP插入://文檔.datastax.com/EN /開發/ Java的應用程序/ 3.1 /手動/ –

1

我認爲,問題是,你正試圖存儲java.util.Date對象在CQL bigint。映射到bigint在java驅動器的類型是long(參見文檔的'CQL to Java type mapping'部分)。

假設你的意思是在毫秒爲單位存儲在此列中,您有幾種選擇。

  1. 改變列型到timestamp映射到java.util.Date(和設置/通過setTiemstamp/getTimstamp訪問)。
  2. 使用setLong連同Date.getTime()Date轉換爲表示紀元毫秒的long
  3. 創建並註冊一個custom codec映射java.util.Datebigint,即:
import com.datastax.driver.core.*; 

import java.util.Date; 

public class CodecTest { 

    static class DateToBigintCodec extends MappingCodec<Date, Long> { 

     DateToBigintCodec() { 
      // creates a mapping from bigint <-> Date. 
      super(TypeCodec.bigint(), Date.class); 
     } 

     @Override 
     protected Date deserialize(Long value) { 
      return new Date(value); 
     } 

     @Override 
     protected Long serialize(Date value) { 
      return value.getTime(); 
     } 
    } 

    public static void main(String args[]) { 
     TypeCodec<Date> codec = new DateToBigintCodec(); 
     Cluster cluster = Cluster.builder().addContactPoint("127.0.0.1").build(); 
     try { 
      // register custom codec 
      cluster.getConfiguration().getCodecRegistry().register(codec); 

      Date date = new Date(); 
      Session session = cluster.connect(); 
      // insert Date value into column v, which is a bigint. 
      // schema: 
      // CREATE TABLE simple.tbl (k int PRIMARY KEY, v bigint) 
      PreparedStatement prepared = session.prepare("insert into simple.tbl (k, v) values (?, ?)"); 
      BoundStatement bound = prepared.bind(); 
      bound.setInt("k", 0); 
      bound.setTimestamp("v", date); 
      session.execute(bound); 

      // Retrieve column v as a Date. 
      Row row = session.execute("select v from simple.tbl").one(); 
      System.out.println(row.getTimestamp("v")); 
     } finally { 
      cluster.close(); 
     } 
    } 
} 
+0

我只注意到你提到的Java實體',如果這意味着你使用的是映射模塊,如果你創建的編解碼器就像我描述和之前註冊它創建映射器,這也將與映射器一起工作。 –

相關問題