2009-08-11 1 views
1

AppEngine 1.2.2. 그래서 같은 수준의 제품을 정의Java App Engine Datastore : 객체의 상속 된 클래스 필드를 쿼리하는 방법은 무엇입니까?

으로 PersistenceManager의 오후 = PMF.get : 다음 새로운 오브젝트과 같이 할

@PersistenceCapable(identityType = IdentityType.APPLICATION, table="Products") 
public class Book extends Product { 

public Book(String author, String title) { 
    super(title); 
    this.author = author; 
} 

public String getAuthor() { 
    return author; 
} 

@Persistent 
String author; 
} 

:

@PersistenceCapable(identityType = IdentityType.APPLICATION, table="Products") 
public class Product { 

public Product(String title) { 
    super(); 
    this.title = title; 
} 

public String getTitle() { 
    return title; 
} 

@Persistent 
String title; 

@PrimaryKey 
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
private Key id; 
} 

내가 파생 클래스의 책과 같이 정의() .getPersistenceManager(); pm.makePersistent (새 책 ("George Orwell", "1984")); 내가 좋아하는 쿼리를 사용하여이 새 개체에 대한 조회 할 수 있습니다

:

검색어 쿼리 = pm.newQuery은 ((+ Book.class.getName "선택") + "여기서 저자 == PARAM"); query.declareParameters ("String param"); 리스트 결과 = (리스트) query.execute ("George Orwell");

Book에 정의 된 'author'필드를 쿼리하기 때문에이 개체가 반환됩니다.

그러나이 작동하지 않습니다

쿼리 쿼리를 = pm.newQuery은 ((+ Book.class.getName "선택") + "여기서 제목 == PARAM"); query.declareParameters ("String param"); 리스트 결과 = (리스트) query.execute ("1984");

필드 'title'이 없다는 예외를 throw합니다.이 경우에도 파생 클래스 Product에 정의되어 있어도 예외입니다.

javax.jdo.JDOUserException: Field "title" does not exist in com.example.Book or is not persistent 
NestedThrowables: 
org.datanucleus.store.exceptions.NoSuchPersistentFieldException: Field "title" does not exist in com.example.Book or is not persistent 

Datastore 쿼리에서 상속 된 클래스의 입력란을 사용할 수없는 것처럼 보입니다.

구문에 변형이 있거나 주석이있는 경우 실제로 가능합니까?

답변

3

:

JDO

http://code.google.com/appengine/docs/java/datastore/usingjdo.html

지원되지 않는 기능 JDO 인터페이스의 다음 기능은 App Engine 구현에서 지원되지 않습니다.

소유되지 않은 관계. 명시 적 Key 값을 사용하여 소유되지 않은 관계를 구현할 수 있습니다. 소유되지 않은 관계에 대한 JDO의 구문은 다음 릴리스에서 지원 될 수 있습니다. 소유 한 다 대 다 관계.

"Join"쿼리. 상위 종류의 쿼리를 수행 할 때 하위 엔티티 필드를 필터에 사용할 수 없습니다. 키를 사용하여 쿼리에서 부모의 관계 필드를 직접 테스트 할 수 있습니다.

JDOQL 그룹화 및 기타 집계 쿼리.

다형성 쿼리클래스의 쿼리를 수행하여 하위 클래스의 인스턴스를 가져올 수는 없습니다. 각 클래스는 데이터 저장소에서 별도의 엔터티 종류로 나타납니다.

@PersistenceCapable 주석의 경우 IdentityType.DATASTORE입니다. IdentityType.APPLICATION 만 지원됩니다.

현재 수퍼 클래스의 영구 필드가 데이터 저장소에 저장되는 것을 방지하는 버그가 있습니다. 이 문제는 향후 릴리스에서 수정 될 예정입니다.

1

우리가 지원하는 다른 데이터 저장소 (예 : RDBMS, XML, Excel 등)와 함께 DataNucleus를 사용하는 쿼리는 실제로 수퍼 클래스의 필드를 허용해야합니다. 쿼리는 유효한 JDOQL입니다. 그들이 GAE에서 작동하지 않는 경우 문제는 상속에 대해이 분명히 존재하지만/J는 구글의 이슈 트래커에서 문제를보고 이미에서 http://code.google.com/p/datanucleus-appengine/issues/list

관련 문제