天天看點

Cassandra 中MappingCodec的用法示例

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



// 主要用于将Cassandra中不支援的類型使用自定義的方法轉換
// 此類錯誤均可使用類似方法解決

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();
        }
    }
}

           

繼續閱讀