2017-02-17 3 views
0

Kundera-Cassandra와 Kundera-Cassandra-ds-driver (버전 3.7)를 사용하고 있습니다. H는 Cassandra에 유지 될 객체 구조를 중첩합니다.Datastax DS-Driver를 사용하는 Kundera는 "필드"가 UDT에 정의 된 필드가 아니라고 불평합니다.

개체가 올바르게 유지되고 find()가 올바른 결과를 반환합니다. 그러나 간단한 쿼리를 실행하면 "ava.lang.IllegalArgumentException :이 UDT에 정의 된 필드가 아닙니다."가 반환됩니다.

Query query = em.createQuery("Select p from Person p", Person.class); 
    List<Person> persons = query.getResultList(); 

Person.java

@Entity 
    @Table(name = "PERSON") 
    public class Person implements Serializable { 

     @Id 
     @Column 
     public String personId; 

     @Embedded 
     public Name name; 

     @ElementCollection 
     public List<Address> addresses = new ArrayList<Address>(); 

     @Column 
     public int age; 
    } 

Name.java

@Embeddable 
    public class Name implements Serializable { 
     @Column 
     public String firstName; 
     @Column 
     public String lastName; 
    } 

Address.java

:

9:11:16.834 [main] INFO com.impetus.kundera.query.QueryImpl - On getResultList() executing query: Select p from Person p 
    09:11:16.834 [main] DEBUG c.i.client.cassandra.query.CassQuery - Populating entities for Cassandra query Select p from Person p. 
    Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 2.219 sec <<< FAILURE! - in com.abc.KunderaTest 
    test(com.abc.KunderaTest) Time elapsed: 2.101 sec <<< ERROR! 
    java.lang.IllegalArgumentException: lastName is not a field defined in this UDT 
      at com.datastax.driver.core.UDTValue.getAllIndexesOf(UDTValue.java:49) 
      at com.datastax.driver.core.AbstractData.getIndexOf(AbstractData.java:66) 
      at com.datastax.driver.core.AbstractGettableData.isNull(AbstractGettableData.java:55) 
      at com.impetus.kundera.client.cassandra.dsdriver.DSClientUtilities.setBasicValue(DSClientUtilities.java:459) 
      at com.impetus.kundera.client.cassandra.dsdriver.DSClientUtilities.setUDTValue(DSClientUtilities.java:431) 
      at com.impetus.kundera.client.cassandra.dsdriver.DSClientUtilities.assign(DSClientUtilities.java:393) 
      at com.impetus.kundera.client.cassandra.dsdriver.DSClient.iteratorColumns(DSClient.java:909) 
      at com.impetus.kundera.client.cassandra.dsdriver.DSClient.populateObjectFromRow(DSClient.java:803) 
      at com.impetus.kundera.client.cassandra.dsdriver.DSClient.iterateAndReturn(DSClient.java:792) 
      at com.impetus.kundera.client.cassandra.dsdriver.DSClient.executeQuery(DSClient.java:531) 
      at com.impetus.client.cassandra.query.CassQuery.populateEntities(CassQuery.java:146) 
      at com.impetus.kundera.query.QueryImpl.fetch(QueryImpl.java:1377) 
      at com.impetus.kundera.query.QueryImpl.getResultList(QueryImpl.java:200) 
      at com.impetus.kundera.query.KunderaTypedQuery.getResultList(KunderaTypedQuery.java:250) 

여기가 실행 된 쿼리입니다 생성 된 테이블에

@Embeddable 
    public class Address implements Serializable { 
     @Column 
     public String city; 
     @Column 
     public String country; 
    } 

카산드라 CQLSH는 :

CREATE TYPE mykeyspaces."Address" (
     country text, 
     city text 
    ); 

    CREATE TYPE mykeyspaces."Name" (
     "firstName" text, 
     "lastName" text 
    ); 

    CREATE TABLE mykeyspaces."PERSON" (
     "personId" text PRIMARY KEY, 
     addresses list<frozen<"Address">>, 
     age int, 
     name frozen<"Name"> 
    ) 

상황이 DS-드라이버와 함께 드리프트와 잘하지만 작동합니다. 내가 누락 된 경우 알려주십시오.

감사합니다.

답변

0

코드를 디버깅했으며 datastax 드라이버의 버그 인 것 같습니다.

버그 : case-sensitive 이름

이제에 대한 해결 방법으로 firstname, lastname 같은 것을 사용할 수 있습니다와 가져 오기 UDT 열.

다음 작품 :

@Embeddable 
public class Name implements Serializable { 
    @Column(
    public String firstname; 
    @Column 
    public String lastname; 
}