一种将appengine数据存储实体转换为我的对象的方法?

使用google appengine 1.3.0 w / java和jdo …

在尝试为一对多拥有的关系编写JDO查询时,我遇到了一个我认为非常聪明的非JDO概念。 祖先Querys。 appengine.api.datastore.Query接口允许使用父键确定查询范围。

不幸的是,查询的结果是带有属性列表的“实体”对象。 apis中是否有一个util会将其中一个Entity对象转换为我的JDO对象,甚至是一个简单的DTO bean(与我的JDO对象匹配)?

我用下面的代码强行破解了它,但不喜欢双重查找。

PersistenceManager pm; DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); List 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() ) ); } 

这不是我认为你在寻找的银弹; 它需要一些艰苦的工作来完成。

DAO代码

 DatastoreService datastore = DatastoreServiceFactory .getDatastoreService(); List results = new ArrayList(); Query query = new Query("Foo", KeyFactory.stringToKey("")); List 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(); } 

你可以使用org.datanucleus.store.appengine.JDODatastoreBridge.toJDOResult()