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

时间:2010-09-10 22:02:49

标签: java jdo datanucleus jdoql

我有一个界面

@PersistenceCapable
public interface MyInterface {

    public abstract String getName();

    public abstract void setName(String name);

}

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

查询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);
  5. JDO仍然不断抛出异常(请看底部)。如果这适用于接口,我不是shure,但是有一个get和set accesor方法,这是java bean术语中的一个属性。我将@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)
    

1 个答案:

答案 0 :(得分:0)

您的查询似乎没有很好地形成。异常表示无效的字符串litteral ,并且在查询示例中,有一个未闭合的双引号字符。也许你应该尝试这样的事情:

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