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-드라이버와 함께 드리프트와 잘하지만 작동합니다. 내가 누락 된 경우 알려주십시오.
감사합니다.