我有一个界面
@PersistenceCapable
public interface MyInterface {
public abstract String getName();
public abstract void setName(String name);
}
持久层使用 JDO。JDO 实现是DataNucleus。现在我想用 JDOQL 查询该接口的任何实例。
查询查询 = getPersistenceManager().newQuery(MyInterface.class);
这很好用。现在我想按名称过滤查询结果。当然接口没有属性。其实现的属性可能不同。MyInterface 的任何实例都通过 getName() 方法返回其名称。
如何将此方法与 JDOQL 一起使用?
我试了一下:
query.setFilter("name == \"" + name);
query.setFilter("name() == \"" + name);
query.declareVariables("myPackage.MyInterface myInterface"); query.setFilter("myInterface.name == \"" + name);
query.declareVariables("myPackage.MyInterface myInterface"); query.setFilter("myInterface.name() == \"" + name);
JDO 仍然不断抛出异常(看底部)。我不确定这是否适用于接口,但是有一个 get 和一个 set 访问器方法,这是 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)