2010-10-03 40 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