2017-01-11 4 views
1

J'ai le tableau emp(id,name,list<frozen<address>>). Ici l'adresse est cassandra UDT définie comme create TYPE address (hno int,street text);. Je suis en train de lire toutes les adresses est pour un identifiant donné dans emp en utilisant ci-dessous le code et je reçois l'erreur suivante:Comment lire les UDT de collection (ex: list) de UDT avec cassandra-driver en 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()); 

`

Ici, comment saisir la liste des adresses congelés en java code qui est retourné de cassandra?

Veuillez nous aider.

+0

Formage général – Paul

+0

Des versions antérieures du pilote avaient des bogues autour de cette fonction. Assurez-vous que vous utilisez la version la plus récente. – Aaron

Répondre

1

Vous pouvez lire la valeur de la ligne et de lire la ligne de métadonnées par ligne:

UDTValue udtData = row.getUDTValue(address); 

Par exemple:

udtData.getString("name"); 

mise à jour avec l'exemple de la liste

Pour une liste, il devrait probablement ressembler à:

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

Et puis vous pouvez facilement parcourir la liste et accéder aux champs de vos données.

Meilleur

+0

Mais, dans mon cas, c'est une collection (liste) d'UDT gelés. Comment, pouvons-nous obtenir cette liste d'adresse avec votre morceau de code qui est, UDTValue udtData = row.getUDTValue (adresse); ? Votre code fonctionne bien si je ne stocke qu'un seul UDT au lieu de la liste >. Corrigez-moi si je me trompe. – user553182

+0

Hey merci @questionare. Mais, votre code devrait être réécrit comme Liste udtDataList = row.getList ("adresses", UDTValue.class); merci. – user553182

0

Vous pouvez utiliser DataStax Mapper à cette fin. Vous devez déclarer votre table de Java et le tableau de type en utilisant des annotations DataStax comme ceci:

@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) 
    } 

Et votre UDT annotée comme ci-dessous:

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

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

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

      ...(Getters and Setters) 
    } 

Vous pouvez ajouter la dépendance suivante à votre pom.xml déposer au préalable si vous n'avez pas

<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> 

Après ces étapes, vous devez utiliser l'objet mappeur pour obtenir vos résultats:

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

Et une fois que vous obtenez resultSet utilisation mappeur pour obtenir:

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

Maintenant, vous pouvez accéder emp comme objet java et utiliser emp.getAddress pour accéder à votre liste.