Java App Engine Datastore: Como consultar campos de classes herdadas do objeto?
-
12-09-2019 - |
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?
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