2010-02-18 135 views
5

使用google appengine 1.3.0 w/java和jdo ...一種將appengine數據存儲實體轉換爲我的對象的方法?

在嘗試編寫一對多擁有關係的JDO querys時,我遇到了一個非JDO概念,我認爲它非常聰明。祖先Querys。 appengine.api.datastore.Query接口允許使用父鍵對查詢進行範圍化。

不幸的是,查詢的結果是帶有屬性列表的'實體'對象。 在apis中是否有util會將這些實體對象之一轉換爲我的JDO對象,甚至是一個簡單的DTO bean(與我的JDO對象匹配)?

我已經採取了一種破解強制它與下面的代碼,但不喜歡雙重查找。

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

類Foo

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

相關問題