2010-02-18 6 views
5

자바와 jdo를 사용하여 google appengine 1.3.0을 사용 중 ...appengine 데이터 스토어 개체를 내 개체로 변환하는 방법은 무엇입니까?

1 대 다수 소유 관계를 위해 JDO 쿼리를 작성하는 동안 실제로는 영리하다고 생각하는 비 JDO 개념을 발견했습니다. 조상 Querys. appengine.api.datastore.Query 인터페이스를 사용하면 상위 키를 사용하여 쿼리의 범위를 지정할 수 있습니다.

불행히도 쿼리의 결과는 속성 목록이있는 'Entity'개체입니다. api에는 이러한 Entity 객체 중 하나를 JDO 객체 또는 간단한 DTO Bean (내 JDO 객체와 일치)으로 변환하는 util이 있습니까?

나는 아래의 코드로 그것을 강요하지만 무언가를 두들겨 먹었지 만 이중 룩업을 좋아하지 않는다.

PersistenceManager pm; 
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); 
List<MyObject> results; 

com.google.appengine.api.datastore.Query query = new Query("MyObject", KeyFactory.stringToKey(parentId)); 
query.addFilter("rank", Query.FilterOperator.GREATER_THAN_OR_EQUAL, minRank); 
query.addSort("rank"); 
query.setKeysOnly(); 
for (Entity anEntity : datastore.prepare(query).asIterable()) { 
    results.add(pm.getObjectById(MyObject.class, anEntity.getKey())); 
} 

답변

4

이것은 당신이 찾고있는 은총입니다. 그것을 성취하기 위해서는 약간의 과감한 작업이 필요합니다.

DAO 코드는

DatastoreService datastore = DatastoreServiceFactory 
.getDatastoreService(); 
List<Foo> results = new ArrayList<Foo>(); 

Query query = new Query("Foo", KeyFactory.stringToKey("")); 
List<Entity> entities = datastore.prepare(query).asList(
    FetchOptions.Builder.withDefaults()); 

for (Entity entity : entities) { 
    results.add(new Foo(entity)); 
} 

클래스 푸

public Foo(Entity entity) { 
    // TODO get properties from entity and populate POJO 
    this.bar=entity.getProperty("bar"); 
    //get the key 
    //if the @PrimaryKey is a Long use this 
    this.id=entity.getKey().getId(); 
    //if the @PrimaryKey is a String use this 
    this.id=entity.getKey().getName(); 
} 
5

당신이 사용할 수있는 org.datanucleus.store.appengine.JDODatastoreBridge.toJDOResult()

관련 문제