0

是的,我不知道我是不是完全找错了树——我发现 JDO 和 Google 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 类是可序列化的并且非常基础......

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

...那么人们有什么技术或建议可以让它发挥作用?

提前致谢。

4

2 回答 2

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();
于 2010-01-18T02:11:21.680 回答
1

您的字段在数据存储中被序列化,因此您显然无法在数据存储中进行查询,因此所有这些记录都需要检索并且查询在内存中进行。当 GAE/J 最终齐心协力并允许人们这样做时,这将是微不足道的,在此之前,您需要自己检索所有记录并进行检查。

和join完全没有关系

于 2010-01-18T16:06:30.073 回答