2009-11-02 31 views

回答

0

如果您使用的是低級別數據存儲,則很容易,因爲「祖先」是數據存儲概念,而不是JDO/JPA概念AFAIK。

here是顯示查詢構造函數的祖先鍵的Javadoc鏈接

1

試試這個辦法:

// PersistenceManager pm = ...; 
Transaction tx = pm.currentTransaction(); 
User user = userService.currentUser(); 
List<Account> accounts = new ArrayList<Account>(); 

try { 
    tx.begin(); 

    Query query = pm.newQuery("select from Customer " + 
           "where user == userParam " + 
           "parameters User userParam"); 
    List<Customer> customers = (List<Customer>) 
    query.execute(user); 

    query = pm.newQuery("select from Account " + 
         "where parent-pk == keyParam " + 
         "parameters Key keyParam"); 
    for (Customer customer : customers) { 
     accounts.addAll((List<Account>) 
     query.execute(customer.key)); 
    } 

} finally { 
    if (tx.isActive()) { 
     tx.rollback(); 
    } 
} 

的更多信息,請訪問: http://code.google.com/appengine/docs/java/datastore/transactions.html#Uses_For_Transactions

+0

您尚未在任何地方提交交易。 – Price 2015-10-27 19:34:47

2

我掙扎這一段時間,但以下將工作!簡短的回答是,JDO與App Engine使用絕對可以支持祖先查詢,所以你不必訴諸底層API獨特到App Engine,特別是在你想和JDO堅持整個應用程序的情況。

第1步:

在子類中確保有下列實例變量。變量的實際名稱無關緊要。重要的是註釋。

@Persistent 
@Extension(vendorName="datanucleus", key="gae.parent-pk", value="true") 
private String mParentEncKey; 

第2步:

當查詢子對象(S)由主密鑰,你想通過你創建的實例變量的名稱上parentKey到然後過濾...在這case這個例子用於如果你想查詢一組具有屬性的子對象,假設你知道父鍵和那個屬性。

public static List<ChildObject> queryYourChildObjects(String parentKey, String someProperty) { 

     PersistenceManager pm = PMF.get().getPersistenceManager(); 
     Query q = pm.newQuery(ChildObject.class); 
     q.setFilter("mParentEncKey == parentKeyParam && property == propertyParam"); 
     q.declareParameters("String parentKeyParam, String propertyParam"); 
     List<ChildObject> results = (List<ChildObject>) q.execute(parentKey, someProperty); 
     return results; 
    } 

就是這樣!希望有幫助。

+0

您還可以在這個相關答案用物化,因爲:http://stackoverflow.com/a/11365390/305689 – wescpy 2013-09-13 04:13:24