【问题标题】:cassandra java binding a collection of maps to a prepared statementcassandra java将映射集合绑定到准备好的语句
【发布时间】:2017-03-24 18:55:39
【问题描述】:

我正在使用 datastax 的 Cassandra Java 驱动程序。我的 Cassandra 仅支持 CQL 2。

我有一个准备好的 INSERT 语句,需要接受地图列表。

这是我的架构:

CREATE TYPE test.snap_guid (
    l bigint,
    h bigint
);

CREATE TABLE test.t (
    id   bigint,
    snap list<frozen<snap_guid>>,
    PRIMARY KEY ((id))
)

这是准备好的语句:

PreparedStatement mysttmt = <client>.prepare("INSERT INTO test.t (id, snap) VALUES (?, ?)");

我知道为了将集合绑定到准备好的语句,我需要创建一个集合并绑定它。我无法将集合括号放在准备好的查询中。例如(对于文本列表):

ArrayList<String> snaps = new ArrayList<>();
snaps.add("AEF34GF665");
// INSERT INTO test.t (id, snap) VALUES (?, ?)
BoundStatement bs = mysttmt.bind(12, snaps);

我的问题是:如何绑定地图列表?如何创建类似下一个的查询?

INSERT INTO test.t (id, snap) VALUES (12, [{l:10,h:50}])

// I know it is impossible to create the following prepared statement:
INSERT INTO test.t (id, snap) VALUES (?, [{l:?,h:?}])

// The list of maps has to be a single bound variable... how???
INSERT INTO test.t (id, snap) VALUES (?, ?)

【问题讨论】:

    标签: java cql datastax-java-driver


    【解决方案1】:
    1. 创建表:

      CREATE TYPE my_type (
      user_id text,
      name text,
      age bigint
      );
      
      CREATE TABLE my_table_with_set_of_udt (
      my_key text PRIMARY KEY,
      my_types set<frozen <my_type>>
      );
      
      CREATE INDEX ON my_table_with_set_of_udt(my_types);
      
    2. 创建映射类和bean:

      @UDT(keyspace = "my_ks", name = "my_type")
      public class MyType {
      @Field(name = "user_id")
      private String userId;
      
      @Field(name = "name")
      private String name;
      
      @Field(name = "age")
      private int age;
      
      // getters, setters & constructors
      // equals & hashCode are required for a set
      }
      
      @Table(keyspace = "my_ks", name = "my_table_with_set_of_udt")
      public class MyTableWithSetOfUDT {
      
      @PartitionKey
      @Column(name = "my_key")
      private String myKey;
      
      @Column(name = "my_types")
      @FrozenValue // because of --> set<frozen <my_type>>
      private Set<MyType> myTypes;
      
      // getters, setters & constructors
      // equals & hashCode are required for a set
      }
      
      @Bean
      public Mapper<MyTableWithSetOfUDT> myTableWithSetOfUDTMapper() {
      return new MappingManager(cassandraClient.getSession()).mapper(MyTableWithSetOfUDT.class);
      }
      
      @Bean
      public UDTMapper<MyType> myTypeMapper() {
      return new MappingManager(cassandraClient.getSession()).udtMapper(MyType.class);
      }
      
    3. 创建准备好的语句,例如:

      addUpdateStatement = cassandraClient.getSession().prepare("UPDATE my_table_with_set_of_udt SET my_types = my_types + ? WHERE my_key=?;");
      deleteUpdateStatement = cassandraClient.getSession().prepare("UPDATE my_table_with_set_of_udt SET my_types = my_types - ? WHERE my_key=?;");
      
    4. 绑定参数:

      MyType myType = MyType(userId, name, age);
      UDTValue value = myTypeMapper.toUDT(myType);
      cassandraClient.getSession().execute(addUpdateStatement.bind(Sets.newHashSet(value), myKey));
      

      cassandraClient.getSession().execute(deleteUpdateStatement.bind(Sets.newHashSet(value), myKey));
      
    5. 在表中插入一条记录,值为my_key(您可以直接在cql中执行此操作)。

    6. 运行代码,现在我们可以通过使用我们的 UDT 更新表来向集合中添加/删除元素。

    【讨论】:

      【解决方案2】:

      我有办法。

      看来问题是错误的。我需要添加 UDT 列表(用户定义的点击),而不是哈希列表。为此,您需要使用 UserType 和 UDTValue:

      UserType myUDT = <client>.getSession().getCluster().
          getMetadata().getKeyspace("test").getUserType("snap_guid");
      UDTValue mySnap = myUDT.newValue();
      mySnap.setLong("h", 50);
      mySnap.setLong("l", 10);
      
      ArrayList<UDTValue> snaps = new ArrayList<>();
      snaps.add(mySnap);
      // INSERT INTO test.t (id, snap) VALUES (?, ?)
      BoundStatement bs = mysttmt.bind(12, snaps);
      

      【讨论】:

        猜你喜欢
        • 2014-09-27
        • 2018-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-01
        • 1970-01-01
        • 2015-08-13
        • 2013-06-16
        相关资源
        最近更新 更多