2010-10-03 81 views
2

我在探索appengine(java),並根據主題,我如何使用DatastoreService獲取基於密鑰和條件的實體?Appengine java獲取基於密鑰和條件的實體

我的方案,培訓師有許多與用戶的一對多的關係,所以我有我的結構,所以

Trainer(id, name, type, department) 
User(id, name, address, is_activated) 
TrainerUser(id, trainer_id, user_id) 

我們得到一個特定的教練下的所有用戶,我獲取所有從TrainerUser的USER_ID按trainer_id過濾。一切都好。然後,我想教練在所有激活用戶,所以我的計劃是在循環遍歷獲取USER_ID的,並呼籲像

Query q = new Entity('User'); 
q.addFilter('Key', EQUAL, userId); 
q.addFilter('is_activated', EQUAL, True); 

但據我所知,關鍵是不是一個真正的物理特性在其中可以使用addFilter()來訪問,所以頂部的代碼只會返回一個空實體。

有沒有辦法在實體中引用Key?任何魔術關鍵字?

回答

0

Entity.KEY_RESERVED_PROPERTY是您可以用於密鑰的屬性名稱。

保留的屬性名稱,用於引用實體的鍵。這個字符串可以用於過濾和排序實體密鑰本身。

因此通過關鍵

query.addFilter(Entity.KEY_RESERVED_PROPERTY, FilterOperator.EQUAL, myKey); 
0

爲什麼不通過培訓師過濾和is_activated?這是類似Python的僞代碼:

activated_users_for_trainer = User.all().filter("trainer =", trainer_key).filter("is_actived =", True).fetch(100) 
+0

這適用於一對多關係,但在我的情況下,由於培訓師和用戶處於多對多關係,trainer_key不在用戶表中。 – 2010-10-04 03:15:26

+0

因爲你會經常做這個查詢,所以我建議在用戶上添加教練鍵到db.ListProperty(type = db.Key)。這將用戶所擁有的培訓者人數限制在最大值(500或1000),這應該足夠了。 培訓師可能會擁有比用戶擁有培訓師更多的用戶。因此,該列表位於用戶模型上,而不是Trainer上。 – mahmoud 2010-10-06 16:11:59

0

它更容易和優化我想獲得通過ID的實體進行過濾,然後,如果存在,驗證是否is_activated,對數據存儲是由ID實體更快和更便宜的get下一次驗證僅在內存中運行。 As in this responses