2010-09-10 26 views
0

我有一个接口如何查询接口并使用JDOQL过滤结果集?

@PersistenceCapable 
public interface MyInterface { 

    public abstract String getName(); 

    public abstract void setName(String name); 

} 

持久层使用JDO。 JDO的实现是DataNucleus。现在我想用JDOQL查询该接口的任何实例。

Query query = getPersistenceManager()。newQuery(MyInterface.class);

这工作正常。现在我想按名称过滤查询结果。当然,界面没有属性。其实施的属性可能不同。任何MyInterface实例都会通过getName()方法返回它的名称。

如何在JDOQL中使用此方法?

我尝试了一下:

  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仍保持抛出异常(看底部)。我不确定这是否适用于接口,但是有一个get和一个accesor方法,这是java beans术语中的一个属性。我将@Persistent注释添加到接口的getName()方法及其实现中,但没有任何更改。

如何筛选接口实例的查询?

在此先感谢。

这里是例外JDO抛出:

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) 

回答

0

看来,您的查询的格式不正确。异常表示字符串无效,并且在您的查询示例中存在未封闭的双引号字符。也许你应该尝试这样的事情:

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

thx,我把参数指令混合起来。它现在可以工作,但我不确定它的标准兼容功能是否可以通过它们的属性过滤接口,以及它是否可以与DataNucleus以外的其他JDO实现一起使用。这里是一个JDO书籍的链接:http://www.orientechnologies.com/docs/JavaDataObjects-RobinRoos-1.0.pdf在第113页有关于范围和接口的一些解释。在这个解决方案中我没有明确地使用扩展。这本书是从2003年开始的,在这一点上可能不是最新的。如果我得到更多的信息,我会在这里发布。 – PageFault 2010-09-12 00:03:56