Pergunta

AppEngine 1.2.2. I definir uma classe Product assim:

@PersistenceCapable(identityType = IdentityType.APPLICATION, table="Products")
public class Product {

 public Product(String title) {
  super();
  this.title = title;
 }

 public String getTitle() {
  return title;
 }

 @Persistent
 String title;

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

Eu definir uma classe Livro derivado assim:

@PersistenceCapable(identityType = IdentityType.APPLICATION, table="Products")
public class Book extends Product {

 public Book(String author, String title) {
  super(title);
  this.author = author;
 }

 public String getAuthor() {
  return author;
 }

 @Persistent
 String author;
}

Eu, então, fazer um novo objeto da seguinte forma:

PersistenceManager pm = PMF.get () getPersistenceManager (.); pm.makePersistent (novo livro ( "George Orwell", "1984"));

Eu posso consultar para este novo objeto usando uma consulta como:

Consulta query = pm.newQuery ( "selecionar" + Book.class.getName () + "onde o autor == param"); query.declareParameters ( "String param"); resultados da lista = (List) query.execute ( "George Orwell");

Isso retorna o objeto, porque eu estou consultando um campo 'autor' definido no livro.

No entanto, isto não funciona:

Consulta query = pm.newQuery ( "selecionar" + Book.class.getName () + "onde título == param"); query.declareParameters ( "String param"); resultados da lista = (List) query.execute ( "1984");

Ele lança uma exceção que diz não há nenhum campo 'title', mesmo através deste é definido na classe de produto derivado.

javax.jdo.JDOUserException: Field "title" does not exist in com.example.Book or is not persistent
NestedThrowables:
org.datanucleus.store.exceptions.NoSuchPersistentFieldException: Field "title" does not exist in com.example.Book or is not persistent

Parece como se campos de classes herdadas não estão disponíveis nas consultas de armazenamento de dados.

É este, de facto, possível com uma variação sobre a sintaxe, ou com anotações?

Foi útil?

Solução

De: http://code.google.com/appengine /docs/java/datastore/usingjdo.html

Não há suporte para recursos do JDO

Os seguintes recursos da interface JDO não são suportados pela implementação App Engine:

relacionamentos não proprietários. Você pode implementar relacionamentos sem dono usando valores Key explícitos. sintaxe de JDO para relacionamentos sem dono pode ser suportado em uma versão futura. De propriedade de muitos para muitos relacionamentos.

"Join" consultas. Você não pode usar um campo de uma entidade filho em um filtro ao executar uma consulta do tipo pai. Note que você pode testar campo de relacionamento do pai diretamente na consulta usando uma chave.

JDOQL agrupamento e outras consultas agregadas.

polimórfica consulta. Você não pode executar uma consulta de uma classe para obter instâncias de uma subclasse. Cada classe é representada por um tipo entidade separada no armazenamento de dados.

IdentityType.DATASTORE para a anotação @PersistenceCapable. Apenas IdentityType.APPLICATION é suportado.

Existe atualmente um bug que impedia prevenção campos persistentes em superclasses de ser salvo no armazenamento de dados. Isso será corrigido em uma versão futura.

Outras dicas

Essa consulta, usando DataNucleus com qualquer um dos outros armazenamentos de dados que suportam (por exemplo RDBMS, XML, Excel, etc), deve realmente permitir campos em superclasses; a consulta é válida JDOQL. Se eles não funcionam em GAE / J, em seguida, comunicar o problema no issue tracker do Google, embora não há certamente uma questão sobre a herança já http://code.google.com/p/datanucleus-appengine/issues/ lista

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top