2010-02-18 7 views
5

google appengine Mit 1.3.0 w/java und jdo ...eine Möglichkeit, Appengine Datastore Entity zu meinem Objekt zu konvertieren?

Bei dem Versuch, JDO querys für 1-zu-viele im Besitz Beziehungen zu schreiben, stieß ich auf ein nicht-JDO Konzept, dass ich dachte wirklich klug war. Vorfahren-Querys. Die Schnittstelle appengine.api.datastore.Query ermöglicht das Festlegen einer Abfrage unter Verwendung des übergeordneten Schlüssels.

Leider sind die Ergebnisse der Abfrage 'Entity'-Objekte mit Eigenschaftslisten. Gibt es ein Util in der API, das eines dieser Entity-Objekte in mein JDO-Objekt oder sogar eine einfache DTO-Bean (die mit meinem JDO-Objekt übereinstimmte) konvertiert?

Ich habe einen Riss ein Brute genommen, zwingt es mit dem Code unten, aber nicht die Doppel-Lookup.

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

Antwort

4

Dies ist nicht die Wunderwaffe, nach der Sie gesucht haben; es erfordert etwas Grunzarbeit, um zu erreichen.

DAO-Code

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

Klasse 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

können Sie verwenden org.datanucleus.store.appengine.JDODatastoreBridge.toJDOResult()