2017-03-28 16 views
4

次のように私は、日付型の列とカサンドラのテーブルを持っている:Spring Data Cassandraを使用してjava.util.Date値をCassandraの日付型列に挿入するには?

create table people 
(
    id int primary key, 
    name text, 
    email text, 
    dob date 
); 

私はSpringBoot 1.5.2 +春データカサンドラスターターを使用しています。

@Table("people") 
public class Person { 
    @PrimaryKey 
    Integer id; 
    private String name; 
    private String email; 
    private java.util.Date dob; 
    //setters and getters 
} 

public interface PersonRepository extends CrudRepository<Person, Integer>{ 

} 

次のように私は新しい人を挿入しています:

personRepository.save(new Person(1, "Siva","[email protected]", new java.util.Date())); 

それは、次のエラー投げている:

Caused by: com.datastax.driver.core.exceptions.InvalidQueryException: Expected 4 byte long for date (8) 
    at com.datastax.driver.core.Responses$Error.asException(Responses.java:136) ~[cassandra-driver-core-3.1.4.jar:na] 
    at com.datastax.driver.core.DefaultResultSetFuture.onSet(DefaultResultSetFuture.java:179) ~[cassandra-driver-core-3.1.4.jar:na] 
    at com.datastax.driver.core.RequestHandler.setFinalResult(RequestHandler.java:177) ~[cassandra-driver-core-3.1.4.jar:na] 
    at com.datastax.driver.core.RequestHandler.access$2500(RequestHandler.java:46) ~[cassandra-driver-core-3.1.4.jar:na] 

をしかし、私はその後、タイムスタンプDOB列の型を作る場合それは正常に動作しています。 の日付タイプの列があり、java.util.Dateのタイプのプロパティを使用できますか?

P.s:java.sql.Dateを使用しても、同じエラーが発生します。

+0

あなたは '@Temporal(注釈を追加しようとしたことがありTemporalType.TIMESTAMP) '? – Andremoniy

+0

私はJPAを使用していません。カサンドラのアノテーションもありますか? –

+0

本当ですか? 'Table'と' PrimaryKey'アノテーションとは何ですか? – Andremoniy

答えて

8

使用com.datastax.driver.core.LocalDate

あなたはLocalDate.fromMillisSinceEpoch(新日(LocalDate.fromYearMonthDay(2017、03、28)

    • java.util.DateからLocalDateを取得するために、これらの方法のいずれかを使用することができます).getTime())

    あなたがjava.util.Dateをカッサンドラの日付の種類に挿入できるようにする独自のコーデックです。

    public class DateCodec extends TypeCodec<Date> { 
    
        private final TypeCodec<LocalDate> innerCodec; 
    
        public DateCodec(TypeCodec<LocalDate> codec, Class<Date> javaClass) { 
         super(codec.getCqlType(), javaClass); 
         innerCodec = codec; 
        } 
    
        @Override 
        public ByteBuffer serialize(Date value, ProtocolVersion protocolVersion) throws InvalidTypeException { 
         return innerCodec.serialize(LocalDate.fromMillisSinceEpoch(value.getTime()), protocolVersion); 
        } 
    
        @Override 
        public Date deserialize(ByteBuffer bytes, ProtocolVersion protocolVersion) throws InvalidTypeException { 
         return new Date(innerCodec.deserialize(bytes, protocolVersion).getMillisSinceEpoch()); 
        } 
    
        @Override 
        public Date parse(String value) throws InvalidTypeException { 
         return new Date(innerCodec.parse(value).getMillisSinceEpoch()); 
        } 
    
        @Override 
        public String format(Date value) throws InvalidTypeException { 
         return value.toString(); 
        } 
    
    } 
    

    あなたが登録する必要がありCONNECTIN作成:詳細は

    CodecRegistry codecRegistry = new CodecRegistry(); 
    codecRegistry.register(new DateCodec(TypeCodec.date(), Date.class)); 
    Cluster.builder().withCodecRegistry(codecRegistry).build(); 
    

    を:あなたが1以下のように起動することができます

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

  • 関連する問題