一种将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()