2010-02-18 13 views
5

a través de Google appengine 1.3.0 w/Java y JDO ...una forma de convertir appengine datastore Entity a mi objeto?

al intentar escribir querys JDO por-1-a-muchos relaciones de propiedad, me encontré con un concepto no JDO que me pareció muy inteligente. Ancestor Querys. La interfaz appengine.api.datastore.Query permite determinar el alcance de una consulta utilizando la clave principal.

Desafortunadamente, los resultados de la consulta son objetos 'Entity' con listas de propiedades. ¿Hay alguna utilidad en la apis que convierta uno de estos objetos Entity en mi objeto JDO o incluso un simple bean DTO (que coincida con mi objeto JDO)?

He tomado un crack como un bruto forzándolo con el siguiente código pero no me gusta la búsqueda doble.

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

Respuesta

4

Esta no es la bala de plata que creo que estabas buscando; requiere un poco de trabajo arduo para lograr.

código 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)); 
} 

clase 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

puede utilizar org.datanucleus.store.appengine.JDODatastoreBridge.toJDOResult()

Cuestiones relacionadas