Доступ к пользовательскому классу из класса JDO - PullRequest
0 голосов
/ 18 января 2010

Точно, я не знаю, полностью ли я лаю здесь не то дерево - я нахожу 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; }
}

Итак, мой вопрос ... как мне создать запрос, в котором я могу получить все JDOG-игры, содержащие RPCDataPlayer с id = x?

Я не могу сделать запрос вроде ...

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

... так какие методы или предложения есть у людей, чтобы это сработало?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 18 января 2010

База данных 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 голос
/ 18 января 2010

Ваше поле сериализуется в хранилище данных, поэтому вы, очевидно, не можете выполнить запрос в хранилище данных, поэтому все эти записи нуждаются в извлечении, а запрос выполняется в памяти.Когда GAE / J наконец соберутся вместе и позволят людям делать это, это будет тривиально, до тех пор, пока вам не понадобится самостоятельно извлекать все записи и выполнять проверку.*

...