2010-03-03 2 views
3

J'ai la prochaine persistance des classes capables:Comment récupérer une liste d'objets qui sont une propriété d'une classe avec JDOQL?

@PersistenceCapable 
public class AppAccount { 
    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Long id; 

    @Persistent 
    private String companyName; 
    @Persistent 
    List<AppUser> users = new ArrayList<AppUser>(); 
     // Getters and Setters and other properties 
    } 


@PersistenceCapable 
@EmbeddedOnly 
public class AppUser { 

    @Persistent 
    private String username; 

    @Persistent 
    private String firstName; 

    @Persistent 
    private String lastName; 
     // Getters and Setters and other properties 
} 

Sur la base d'un identifiant de compte d'application, je veux récupérer une liste des utilisateurs:

public static List<AppUser> getUsers(Long application_id) { 
    PersistenceManager pm = JdoUtil.getPm(); 
    Query q = pm.newQuery(
     " select users " + 
     " from " + AppAccount.class.getSimpleName() + 
     " where id == idParam" + 
     " parameters Long idParam");   
    return (List<AppUser>) q.execute(application_id); 
} 

Je reçois l'erreur suivante:

WARNING: Candidate class for JDOQL single-string query (AppAccount) could not be resolved 
AppAccount 
org.datanucleus.exceptions.ClassNotResolvedException: AppAccount 
    at org.datanucleus.util.Imports.resolveClassDeclaration(Imports.java:194) 
    at org.datanucleus.store.query.AbstractJDOQLQuery.<init>(AbstractJDOQLQuery.java:114) 
    at org.datanucleus.store.appengine.query.JDOQLQuery.<init>(JDOQLQuery.java:65) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
    at org.datanucleus.plugin.NonManagedPluginRegistry.createExecutableExtension(NonManagedPluginRegistry.java:572) 
    at org.datanucleus.store.appengine.DatastorePluginRegistry.createExecutableExtension(DatastorePluginRegistry.java:124) 
    at org.datanucleus.plugin.PluginManager.createExecutableExtension(PluginManager.java:324) 
    at org.datanucleus.store.query.QueryManager.newQuery(QueryManager.java:203) 
    at org.datanucleus.jdo.JDOPersistenceManager.newQuery(JDOPersistenceManager.java:1291) 
    at org.datanucleus.jdo.JDOPersistenceManager.newQuery(JDOPersistenceManager.java:1234) 
    at com.softamo.pelicamo.invoices.server.Store.getUsers(Store.java:44) 
    at com.softamo.pelicamo.invoices.test.server.StoreTest.testGetUsers(StoreTest.java:40) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

Répondre

2

Pourquoi utiliser getSimpleName() puisque cela ne fait que mettre le nom de la classe? JDOQL nécessite le nom de la classe, , y compris le paquet selon la spécification JDO (getName() est préférable). Aussi, vous n'avez pas besoin de @Persistent sur les champs String, peu importe ce que Google vous dit :-P Saludos

+1

qui était la solution pour moi, utilisez getName() à la place – BROCK

Questions connexes