2017-01-11 5 views
1

У меня есть стол emp(id,name,list<frozen<address>>). Здесь адрес cassandra UDT определяется как create TYPE address (hno int,street text);. Я пытаюсь прочитать все адреса для данного идентификатора в ом, используя ниже кода и я получаю следующее сообщение об ошибке:Как читать UDT из коллекции (для примера: список) UDT с помощью cassandra-драйвера в java?

Exception in thread "main" com.datastax.driver.core.exceptions.CodecNotFoundException: Codec not found for requested operation: [frozen<'address'> <-> com.xyz.cassandra.address]

String query1="select * from iotbilling.emp where id=?"; 
PreparedStatement preparedStatement2=this.session.prepare(query1); 
BoundStatement boundStatement2=preparedStatement2.bind(4); 
ResultSet rs2=this.session.execute(boundStatement2); 
Row row2=rs2.one(); 
List<address> addresses=row2.getList("adresses",address.class); 
System.out.println("Addresses retrieved"); 
for(address adr:addresses) 
    System.out.println(adr.toString()); 

`

Здесь, как захватить список замороженного адреса в Java код, который возвращается из cassandra?

Просьба помочь.

+0

Общее формирование – Paul

+0

В предыдущих версиях драйвера были ошибки вокруг этой функции. Убедитесь, что вы используете самую последнюю версию. – Aaron

ответ

1

Вы можете прочитать значение из строки и прочитать строку метаданных по строкам:

UDTValue udtData = row.getUDTValue(address); 

Например:

udtData.getString("name"); 

Обновление с списка, например

Для СПИСКА должен выглядеть следующим образом:

List<UDTValue> udtDataList = row.getList("adresses", UDTValue.class) 

И тогда вы можете легко перебирать список и получать доступ к полям ваших данных.

Лучшие

+0

Но в моем случае это коллекция (список) замороженных UDT. Как мы можем получить этот список адресов с вашим фрагментом кода, который является UDTValue udtData = row.getUDTValue (адрес); ? Ваш код работает хорошо, если я сохраняю только один UDT вместо списка >. Исправьте меня, если я ошибаюсь. – user553182

+0

Привет, спасибо @questionare. Но ваш код должен быть переписан как Список udtDataList = row.getList («adresses», UDTValue.class); спасибо. – user553182

0

Вы можете использовать datastax Mapper для этой цели. Вы должны объявить таблицу Java и типа таблицы с использованием Datastax аннотаций, как это:

@Table(keyspace = "corporate", name = "emp") 
    public class Employee{ 

      @PartitionKey(0) 
      @Column(name = "id") 
      private Integer id; 

      @Column(name = "name") 
      private String name; 

      @Frozen 
      @Column(name = "address_list") 
      private List<Address> address; 

      ...(Getter and Setters) 
    } 

И ваш UDT аннотированный, как показано ниже:

 @UDT(keyspace = "corporate", name="address") 
    public class Address{ 

      @Field(name="hno") 
      private Integer hno; 

      @Field(name="street") 
      private String street; 

      ...(Getters and Setters) 
    } 

Вы можете добавить следующую зависимость для вашего pom.xml заранее файл, если у вас есть не

<dependency> 
     <groupId>com.datastax.cassandra</groupId> 
     <artifactId>cassandra-driver-core</artifactId> 
     <version>3.3.0</version> 
    </dependency> 
    <dependency> 
     <groupId>com.datastax.cassandra</groupId> 
     <artifactId>cassandra-driver-mapping</artifactId> 
     <version>3.3.0</version> 
    </dependency> 

После этих шагов, которые необходимо использовать объект Mapper, чтобы получить результаты:

MappingManager manager = new MappingManager(this.session); 
    Mapper<Employee> mapper = manager.mapper(Employee.class); 

И как только вы получите Resultset использования картографа, чтобы получить:

Result<Employee> list = mapper.map(rs2); 
    Employee emp = list.one(); 

Теперь вы можете получить доступ к ому как объект Java и использовать emp.getAddress, чтобы получить доступ к списку.

 Смежные вопросы

  • Нет связанных вопросов^_^