2010-09-10 25 views
0

I ont une interfaceComment faire une requête pour une interface et filtrer le resultset avec JDOQL?

@PersistenceCapable 
public interface MyInterface { 

    public abstract String getName(); 

    public abstract void setName(String name); 

} 

La couche de persistance JDO utilise. L'implémentation JDO est DataNucleus. Maintenant, je veux interroger toutes les instances de cette interface avec JDOQL.

Requête query = getPersistenceManager(). NewQuery (MyInterface.class);

Cela fonctionne très bien. Maintenant, je veux filtrer les résultats de la requête par nom. Bien sûr, l'interface n'a aucun attribut. Les attributs de sa mise en œuvre peuvent différer. Toute instance de MyInterface renvoie son nom par la méthode getName().

Comment utiliser cette méthode avec JDOQL?

J'ai essayé un peu:

  1. query.setFilter("name == \"" + name);
  2. query.setFilter("name() == \"" + name);
  3. query.declareVariables("myPackage.MyInterface myInterface"); query.setFilter("myInterface.name == \"" + name);
  4. query.declareVariables("myPackage.MyInterface myInterface"); query.setFilter("myInterface.name() == \"" + name);

JDO garde toujours lancer des exceptions (regarder en bas). Je ne suis pas sûr si cela est applicable aux interfaces, mais il existe une méthode get et une méthode accesseur, qui est une propriété en termes de java beans. J'ai ajouté l'annotation @Persistent à la méthode getName() de l'interface et à son implémentation, mais rien n'a changé.

Comment filtrer une requête pour les instances d'interface?

Merci d'avance.

Voici l'exception JDO lance:

org.datanucleus.jdo.NucleusJDOHelper getJDOExceptionForNucleusException 
INFO: Exception thrown 
Invalid string literal (End of stream): identity.name == "Identity 0 
org.datanucleus.exceptions.NucleusUserException: Invalid string literal (End of stream): identity.name == "Identity 0 
    at org.datanucleus.query.compiler.Lexer.parseStringLiteral(Lexer.java:689) 
    at org.datanucleus.query.compiler.JDOQLParser.processLiteral(JDOQLParser.java:1012) 
    at org.datanucleus.query.compiler.JDOQLParser.processPrimary(JDOQLParser.java:678) 
    at org.datanucleus.query.compiler.JDOQLParser.processUnaryExpression(JDOQLParser.java:621) 
    at org.datanucleus.query.compiler.JDOQLParser.processMultiplicativeExpression(JDOQLParser.java:547) 
    at org.datanucleus.query.compiler.JDOQLParser.processAdditiveExpression(JDOQLParser.java:518) 
    at org.datanucleus.query.compiler.JDOQLParser.processRelationalExpression(JDOQLParser.java:450) 
    at org.datanucleus.query.compiler.JDOQLParser.processAndExpression(JDOQLParser.java:427) 
    at org.datanucleus.query.compiler.JDOQLParser.processExclusiveOrExpression(JDOQLParser.java:413) 
    at org.datanucleus.query.compiler.JDOQLParser.processInclusiveOrExpression(JDOQLParser.java:399) 
    at org.datanucleus.query.compiler.JDOQLParser.processConditionalAndExpression(JDOQLParser.java:385) 
    at org.datanucleus.query.compiler.JDOQLParser.processConditionalOrExpression(JDOQLParser.java:366) 
    at org.datanucleus.query.compiler.JDOQLParser.processExpression(JDOQLParser.java:355) 
    at org.datanucleus.query.compiler.JDOQLParser.parse(JDOQLParser.java:93) 
    at org.datanucleus.query.compiler.JavaQueryCompiler.compileFilter(JavaQueryCompiler.java:462) 
    at org.datanucleus.query.compiler.JDOQLCompiler.compile(JDOQLCompiler.java:101) 
    at org.datanucleus.store.query.AbstractJDOQLQuery.compileInternal(AbstractJDOQLQuery.java:302) 
    at org.datanucleus.store.query.Query.compile(Query.java:1446) 
    at org.datanucleus.jdo.JDOQuery.compile(JDOQuery.java:95) 
    at net.x0ver.utilities.AbstractJdoRepository.executeQuery(AbstractJdoRepository.java:40) 
    at net.x0ver.identitymanagement.persistence.JdoIdentityRepository.getIdentities(MyJdoRepository.java:29) 
    at net.x0ver.identitymanagement.test.MainTest.main(MainTest.java:26) 
Exception in thread "main" javax.jdo.JDOUserException: Invalid string literal (End of stream): identity.name == "Identity 0 
    at org.datanucleus.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:396) 
    at org.datanucleus.jdo.JDOQuery.compile(JDOQuery.java:99) 
    at net.x0ver.utilities.AbstractJdoRepository.executeQuery(AbstractJdoRepository.java:40) 
    at net.x0ver.identitymanagement.persistence.JdoIdentityRepository.getIdentities(MyJdoRepository.java:29) 
    at net.x0ver.identitymanagement.test.MainTest.main(MainTest.java:26) 
NestedThrowablesStackTrace: 
Invalid string literal (End of stream): identity.name == "Identity 0 
org.datanucleus.exceptions.NucleusUserException: Invalid string literal (End of stream): identity.name == "Identity 0 
    at org.datanucleus.query.compiler.Lexer.parseStringLiteral(Lexer.java:689) 
    at org.datanucleus.query.compiler.JDOQLParser.processLiteral(JDOQLParser.java:1012) 
    at org.datanucleus.query.compiler.JDOQLParser.processPrimary(JDOQLParser.java:678) 
    at org.datanucleus.query.compiler.JDOQLParser.processUnaryExpression(JDOQLParser.java:621) 
    at org.datanucleus.query.compiler.JDOQLParser.processMultiplicativeExpression(JDOQLParser.java:547) 
    at org.datanucleus.query.compiler.JDOQLParser.processAdditiveExpression(JDOQLParser.java:518) 
    at org.datanucleus.query.compiler.JDOQLParser.processRelationalExpression(JDOQLParser.java:450) 
    at org.datanucleus.query.compiler.JDOQLParser.processAndExpression(JDOQLParser.java:427) 
    at org.datanucleus.query.compiler.JDOQLParser.processExclusiveOrExpression(JDOQLParser.java:413) 
    at org.datanucleus.query.compiler.JDOQLParser.processInclusiveOrExpression(JDOQLParser.java:399) 
    at org.datanucleus.query.compiler.JDOQLParser.processConditionalAndExpression(JDOQLParser.java:385) 
    at org.datanucleus.query.compiler.JDOQLParser.processConditionalOrExpression(JDOQLParser.java:366) 
    at org.datanucleus.query.compiler.JDOQLParser.processExpression(JDOQLParser.java:355) 
    at org.datanucleus.query.compiler.JDOQLParser.parse(JDOQLParser.java:93) 
    at org.datanucleus.query.compiler.JavaQueryCompiler.compileFilter(JavaQueryCompiler.java:462) 
    at org.datanucleus.query.compiler.JDOQLCompiler.compile(JDOQLCompiler.java:101) 
    at org.datanucleus.store.query.AbstractJDOQLQuery.compileInternal(AbstractJDOQLQuery.java:302) 
    at org.datanucleus.store.query.Query.compile(Query.java:1446) 
    at org.datanucleus.jdo.JDOQuery.compile(JDOQuery.java:95) 
    at net.x0ver.utilities.AbstractJdoRepository.executeQuery(AbstractJdoRepository.java:40) 
    at net.x0ver.identitymanagement.persistence.JdoIdentityRepository.getIdentities(MyJdoRepository.java:29) 
    at net.x0ver.identitymanagement.test.MainTest.main(MainTest.java:26) 

Répondre

0

Il semble que votre requête est pas bien formé. L'exception indique Chaîne non valide littérale et, dans votre exemple de requête, il y a un caractère de guillemets non fermé. Peut-être que vous devriez essayer quelque chose comme ça:

query.setFilter("name == name_value"); 
query.declareParameters("String name_value"); 
query.execute(name); 
+0

Thx, j'ai mélangé les instructions de paramètres. Cela fonctionne maintenant, mais je ne suis pas sûr que ce soit une fonctionnalité compatible standard pour filtrer les interfaces par leurs propriétés et si cela fonctionne avec d'autres implémentations JDO que DataNucleus. Voici un lien vers un livre de JDO: http://www.orientechnologies.com/docs/JavaDataObjects-RobinRoos-1.0.pdf À la page 113, il y a quelques explications sur les extensions et les interfaces. Dans cette solution, je n'ai pas utilisé les extensions explicitement. Le livre date de 2003 et peut ne pas être à jour à ce stade. Si je reçois plus d'informations, je l'afficherai ici. – PageFault