Appengine java基于密钥和条件获取实体

Appengine java基于密钥和条件获取实体,java,google-app-engine,Java,Google App Engine,我正在探索AppEngineJava,根据主题,我如何使用DatastoreService获得基于键和条件的实体 在我的场景中,培训师和用户的关系是多对多的,所以我也有自己的结构 Trainer(id, name, type, department) User(id, name, address, is_activated) TrainerUser(id, trainer_id, user_id) 现在,为了让所有用户都在一个特定的Trainer下,我将从TrainerUser中获取所有用户i

我正在探索AppEngineJava,根据主题,我如何使用DatastoreService获得基于键和条件的实体

在我的场景中,培训师和用户的关系是多对多的,所以我也有自己的结构

Trainer(id, name, type, department)
User(id, name, address, is_activated)
TrainerUser(id, trainer_id, user_id)
现在,为了让所有用户都在一个特定的Trainer下,我将从TrainerUser中获取所有用户id,并按Trainer\u id进行过滤。一切正常。然后我想让所有激活的用户都在培训师的指导下,所以我的计划是循环获取的用户id并调用

Query q = new Entity('User');
q.addFilter('Key', EQUAL, userId);
q.addFilter('is_activated', EQUAL, True);
但据我所知,Key不是一个真正的物理属性,您可以使用addFilter访问它,因此顶部的代码只会返回一个空实体


是否有方法引用实体中的键?有什么神奇的关键字吗?

为什么不由培训师过滤并激活?下面是类似Python的伪代码:

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

为什么不由培训师进行过滤并激活?下面是类似Python的伪代码:

activated_users_for_trainer = User.all().filter("trainer =", trainer_key).filter("is_actived =", True).fetch(100)
是可用于键的属性名称

用于引用实体键的保留属性名。此字符串可用于实体键本身的筛选和排序

所以要按键过滤

query.addFilter(Entity.KEY_RESERVED_PROPERTY, FilterOperator.EQUAL, myKey);
是可用于键的属性名称

用于引用实体键的保留属性名。此字符串可用于实体键本身的筛选和排序

所以要按键过滤

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

它更简单,也更优化,我认为通过id获取实体,然后如果存在验证是否被激活,到数据存储更快更便宜通过id获取实体下一次验证仅在内存上运行

我认为通过id获取实体更简单、更优化,然后如果存在验证是否激活,到数据存储更快、更便宜通过id获取实体下一次验证仅在内存上运行

这对于一对多关系很有效,但是在我的例子中,由于培训师和用户是多对多关系,培训师密钥不在用户表中。由于您将经常执行此查询,我建议将培训师密钥添加到用户的db.ListPropertytype=db.key。这将用户拥有的培训师数量限制为500或1000,这应该足够了。培训师的用户可能比用户拥有培训师的用户多。因此,列表位于用户模型上,而不是Trainer上。这对于一对多关系很有效,但是在我的例子中,由于Trainer和用户处于多对多关系中,Trainer_键不在用户表中。由于您将经常执行此查询,我建议将Trainer键添加到用户上的db.ListPropertytype=db.key。这将用户拥有的培训师数量限制为500或1000,这应该足够了。培训师的用户可能比用户拥有培训师的用户多。因此,列表位于用户模型上,而不是培训师上。