从JDO类访问自定义类

时间:2010-01-18 01:33:36

标签: google-app-engine gwt jdo google-cloud-datastore

是的,我不知道我是不是在这里完全错误地咆哮 - 我发现JDO和谷歌AppEngine有点棘手。无论如何,这里也是。

我有一个类包含另一个类作为其内部变量之一(参见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类是Serializable,非常基础......

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

...那么人们有什么技巧或建议让它起作用?

提前致谢。

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:1)

您的字段在数据存储区中被序列化,因此您显然无法在数据存储区中执行查询,因此所有这些记录都需要检索并在内存中进行查询。当GAE / J最终一起行动并允许人们这样做时,那将是微不足道的,直到那时你需要自己检索所有记录并进行检查。

与联接无关