способ конвертировать Appengine Datastore Entity в мой объект? - PullRequest
5 голосов
/ 18 февраля 2010

Использование google appengine 1.3.0 с java и jdo ...

Пытаясь написать запросы JDO для отношений, принадлежащих одному-многим, я натолкнулся на концепцию не-JDO, которая, как мне казалосьдействительно умныйПредок Querys.Интерфейс appengine.api.datastore.Query позволяет определять область запроса с использованием родительского ключа.

К сожалению, результатом запроса являются объекты Entity со списками свойств.Есть ли в apis утилита, которая преобразует один из этих объектов Entity в мой объект JDO или даже простой бин DTO (который соответствует моему объекту 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() ) );
 }

Ответы [ 2 ]

5 голосов
/ 18 марта 2011

вы можете использовать org.datanucleus.store.appengine.JDODatastoreBridge.toJDOResult()

4 голосов
/ 07 января 2011

Это не серебряная пуля, я думаю, вы искали; для этого требуется некоторая тяжелая работа.

Код 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();
}
...