Pregunta

AppEngine 1.2.2. Defino un producto de clase, así:

@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;
}

defino un libro clase derivada de esta manera:

@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;
}

A continuación, hacer un nuevo objeto de esta manera:

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

Puedo preguntar para este nuevo objeto mediante una consulta como:

consulta consulta = pm.newQuery ( "seleccionar de" + Book.class.getName () + "donde el autor == PARAM");  query.declareParameters ( "param String");  Lista de resultados = (Lista) query.execute ( "George Orwell");

Esto devuelve el objeto, porque yo estoy consultando un campo 'autor' se define en el libro.

Sin embargo, esto no funciona:

consulta consulta = pm.newQuery ( "seleccionar de" + Book.class.getName () + "donde título == PARAM");  query.declareParameters ( "param String");  resultados list = (Lista) query.execute ( "1984");

Se produce una excepción que indica que no hay campo 'título', incluso a través de esto se define en la clase de productos derivados.

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 si los campos de las clases heredadas no están disponibles en las consultas del almacén de datos.

Es esto, de hecho, es posible con una variante de la sintaxis, o con anotaciones?

¿Fue útil?

Solución

a partir de: http://code.google.com/appengine /docs/java/datastore/usingjdo.html

Funciones no compatibles de JDO

Las siguientes características de la interfaz de JDO no son compatibles con la aplicación de App Engine:

relaciones sin propietario. Puede implementar relaciones sin dueño usando valores clave explícitas. La sintaxis de JDO para relaciones sin dueño puede estar soportado en una versión futura. Propiedad muchos-a-muchos.

"Join" consultas. No se puede utilizar un campo de una entidad secundaria en un filtro cuando se realiza una consulta en la clase padre. Tenga en cuenta que puede probar campo de relación de los padres directamente en la consulta utilizando una clave.

agrupación JDOQL y otras consultas de agregado.

consultas polimórficas. No se puede realizar una consulta de una clase para obtener instancias de una subclase. Cada clase está representada por una especie entidad separada en el almacén de datos.

IdentityType.DATASTORE para la anotación @PersistenceCapable. Sólo se admite IdentityType.APPLICATION.

En la actualidad existe un error que la prevención de campos persistentes en superclases de ser guardado en el almacén de datos. Este problema se solucionará en una versión futura.

Otros consejos

Esa consulta, utilizando DataNucleus con cualquiera de los otros almacenes de datos que apoyamos (RDBMS por ejemplo, XML, Excel, etc.), de hecho debe permitir que los campos de las superclases; la consulta es válida JDOQL. Si no trabajan en GAE / J luego informar el tema en seguimiento de incidencias de Google, aunque sin duda hay un problema que hay sobre la herencia ya http://code.google.com/p/datanucleus-appengine/issues/ lista

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top