2010-03-03 58 views
3

我的下一個可持久化類:如何使用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 
} 

基於應用帳戶ID,我要檢索的用戶的列表:

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

我得到了一個錯誤:

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) 

回答

2

爲什麼使用getSimpleName(),因爲它只是放置類名?根據JDO規範(getName()更好),JDOQL需要類名稱,包括包。無論Google告訴你什麼,你也不需要@Persistent字符串字段:-P Saludos

+1

這是我的解決方案,使用getName()而不是 – BROCK 2010-12-03 13:54:08

相關問題