2010-09-12 124 views
3

我一直在关注Google应用程序引擎教程,并且解释JDO的部分是在留言本的基础上完成的。所以当他们查询持久性(我相信BigTable)时,他们有兴趣返回所有结果。JDO Google App Engine验证用户

我想适应这个显示特定用户的结果,但似乎有麻烦。

UserService userService = UserServiceFactory.getUserService(); 
User user = userService.getCurrentUser(); 
if(user != null) { 
    PersistenceManager pm = PerManFac.get().getPersistenceManager(); 
    String query = "select * from " + Team.class.getName(); 
    List<Team> teamList = (List<Team>) pm.newQuery(query).execute(); 
    if(teamList.isEmpty()) { 

那是我到目前为止,我需要适应我的查询字符串哪一部分是“其中用户=用户”,但我得到的问题各一次。

我的团队对象只包含密钥,用户,字符串和日期。

回答

1

您可以在不使用JDOQL的情况下执行此操作。如果用户只有一个团队,那么可以使用双向的owned one to many relationship进行建模。

@PersistenceCapable 
public class Team { 
    @Persistent(mappedBy = "team") 
    private List<Employee> employees; 
} 

@PersistenceCapable 
public class Employee { 
    @PrimaryKey 
    private String user; 

    @Persistent 
    private Team team; 
} 

要获得Employee您可以通过电子邮件查询:

UserService userService = UserServiceFactory.getUserService(); 
User user = userService.getCurrentUser(); 

PersistenceManager pm = PMF.get().getPersistenceManager(); 
Employee employee = pm.getObjectById(Employee.class, user.getEmail()); 
Team employee.getTeam(); 

如果用户可以在多支球队,你需要使用an unowned relationship。从你的描述来看,听起来每个团队都有一个用户(?),所以你可能需要一个无主的多对多关系。

没有很好记录的部分是,您不能使用User对象作为主键(主键为are quite limited的可能类型),所以最终经常使用电子邮件作为主键。一个User对象可以是一个字段,但为了使数据模型保持一致,您经常使用电子邮件无处不在来引用用户,或者像上面那样使用包装器对象。

+0

我收到一个错误,使用您的方法: 例外将[email protected]转换为内部密钥。 我认为它可能来自我的代码中的其他地方,但无法找到它的来源 – AphexMunky 2010-09-12 15:55:23

+0

对不起,刚刚看到你的编辑,你不能使用用户作为主键 – AphexMunky 2010-09-12 15:57:04

+0

谢谢,解决了我的问题 – AphexMunky 2010-09-12 21:41:39