2010-02-18 37 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()

相关问题