2010-09-12 96 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