2010-02-18 6 views
5

Utilizzo di google appengine 1.3.0 w/java e jdo ...un modo per convertire Appengine datastore Entity nel mio oggetto?

Mentre cercavo di scrivere le query JDO per le relazioni di proprietà 1-a-molti, mi sono imbattuto in un concetto non JDO che pensavo fosse davvero intelligente. Ancestor Querys. L'interfaccia appengine.api.datastore.Query consente l'ambito di una query utilizzando la chiave principale.

Sfortunatamente i risultati della query sono oggetti 'Entità' con elenchi di proprietà. C'è un util nell'apis che convertirà uno di questi oggetti Entity nel mio oggetto JDO o anche in un semplice bean DTO (che corrisponde al mio oggetto JDO)?

Ho preso una crepa un bruto forzandolo con il codice sottostante ma non mi piace la doppia ricerca.

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

risposta

4

Questo non è il proiettile d'argento che penso stavi cercando; richiede un po 'di lavoro da fare.

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

classe 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

è possibile utilizzare org.datanucleus.store.appengine.JDODatastoreBridge.toJDOResult()