2010-01-18 67 views
0

對,我不知道我是否在這裏完全歪曲了錯誤的樹 - 我發現JDO和Google AppEngine有點棘手。無論如何,在這裏。從一個JDO類訪問一個自定義類

我有一個包含其他類作爲它的一個類的內部變量(見PLAYER1)

@PersistenceCapable(identityType = IdentityType.APPLICATION) 
    public class JDOGame 
    {  
    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Long id; 

    @Persistent 
    private String map; 

    @Persistent 
    private RPCDataPlayer player1; 

    // getters, setters, constructors etc... 
    } 

類RPCDataPlayer是序列化和非常基本的....

public class RPCDataPlayer implements IsSerializable 
{ 
    public String name; 
    public int id; 

     // getters & setters & constructors oh my 

     public int getId() { return id; } 
} 

所以,我的問題是...如何創建一個查詢,我可以獲取所有包含id = x的RPCDataPlayer的JDOGames?

我不能做一個查詢像...

SELECT FROM JDOGame.class.getName() WHERE player1.getId() == x 

...所以人有什麼技術或建議,這個工作?

在此先感謝。

+0

我認爲它可能工作越來越JDOGame的所有實例從數據庫中,然後通過他們迭代的唯一方法 - 但似乎並沒有特別有效的:( – Spedge 2010-01-18 02:34:36

回答

2

Google App Engine數據庫不是關係數據庫,因此您無法進行連接。您可以將RPCDataPlayer作爲表保存。

@PersistenceCapable(identityType = IdentityType.APPLICATION) 
public class RPCDataPlayer { 

    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Key key; 

    @Persistent(mappedBy = "player1") 
    private List<JDOGame> jdoGames = new ArrayList<JDOGame>(); 

    @Persistent 
    public String name; 

    @Persistent 
    public int id; 

    public int getId() { 
     return id; 
    } 

    public Key getKey() { 
     return key; 
    } 

    public void setJdoGames(List<JDOGame> jdoGames) { 
     this.jdoGames = jdoGames; 
    } 

    public List<JDOGame> getJdoGames() { 
     return jdoGames; 
    } 

} 

然後你可以像這樣查詢這個。

SELECT FROM RPCDataPlayer.class.getName() WHERE id == x 

一旦你和RPCDataPlayer的情況下,你可以得到通過調用得到JDOGame:

List<JDOGame> jdoGames = rpcDataPlayer.getJdoGames(); 
+0

感謝Kodova,但我不太清楚這是怎麼回事,每個遊戲都有一個玩家,但是一個玩家可以成爲許多遊戲的一部分,如果我添加一個叫做player2的第二個玩家怎麼辦? 抱歉不清楚。 – Spedge 2010-01-18 02:16:49

+0

使用更新後的代碼,您可以將玩家的所有遊戲撤回,如果添加玩家,您可以添加player2 JDOGame並在PRCDataPlayer中複製jdoGames併合並這兩個列表。更好的方法是創建一個聯合表格e包含JDOGame,RCPDataPlayer和playerNumber。這需要一個多對多的關係,您可以在這裏閱讀http://code.google.com/appengine/docs/java/datastore/relationships.html#Unowned_Relationships – Kodova 2010-01-18 03:08:13

+0

嗯,正確的 - 謝謝Kodova,我得到它現在。它讓我的頭遠離關係數據庫,這是棘手的問題! – Spedge 2010-01-18 04:03:08

1

您的字段在數據存儲序列化,所以你顯然不能在數據存儲做一個查詢,因此所有這些記錄都需要檢索並在內存中執行查詢。當GAE/J最終一起採取行動並允許人們這樣做時,它將變得微不足道,直到那時你需要自己檢索所有記錄並進行檢查。

無關,與連接在所有

+0

謝謝你,我有點覺得它應該是可能的。我會按照上面的方式去做,並且保留我的時間...... – Spedge 2010-01-20 01:32:30

相關問題