Groovy ';AST不可用';筛选数据集时发生异常

Groovy ';AST不可用';筛选数据集时发生异常,groovy,groovy-sql,Groovy,Groovy Sql,我有以下groovy程序- def people = sql.dataSet('players') def d = people.findAll { true } print d.rows() 我在print语句中遇到一个异常 groovy.lang.GroovyRuntimeException: DataSet unable to evaluate expression. AST not available for closure: in.kshitiz.pgnimport.dao.Play

我有以下groovy程序-

def people = sql.dataSet('players')
def d = people.findAll { true }
print d.rows()
我在print语句中遇到一个异常

groovy.lang.GroovyRuntimeException: DataSet unable to evaluate expression. AST not available for closure: in.kshitiz.pgnimport.dao.PlayerDao$_get_closure1. Is the source code on the classpath?
    at groovy.sql.DataSet.visit(DataSet.java:300)
    at groovy.sql.DataSet.getSqlWhereVisitor(DataSet.java:283)
    at groovy.sql.DataSet.getSqlWhere(DataSet.java:230)
    at groovy.sql.DataSet.getSql(DataSet.java:257)
    at groovy.sql.DataSet.rows(DataSet.java:332)
    at groovy.sql.DataSet$rows.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:112)
    at in.kshitiz.pgnimport.dao.PlayerDao.get(PlayerDao.groovy:13)
    at in.kshitiz.pgnimport.dao.PlayerDao$get.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
    at in.kshitiz.pgnimport.dao.PlayerDaoTest.testGet(PlayerDaoTest.groovy:17)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
    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.runners.ParentRunner.runLeaf(ParentRunner.java:263)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    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)

这个例外没有多大帮助。这意味着什么?

只需将groovy DAO源代码添加到类路径中即可解决问题

在邮件列表中,Guillaume Laforge说:

Sql类的使用有一个转折点

它需要您的Groovy类源代码可用——比如在运行Groovy myScript.Groovy时

例如,当一个类被预编译时,“类节点”将不再可用,因为它不存储在字节码中

这可能是你在这里面临的问题

类节点对于
findall{}
部分是必需的,在这里我们访问AST以创建一个临时查询

摘自(第10章,第343页,第4段)——

数据集实现获取Groovy的 关闭代码。这种内部表示称为 抽象语法树(AST),并由Groovy解析器生成。 通过遍历AST(使用访问者模式),数据集 实现发出每个AST节点的SQL等价物


只需将groovy DAO源代码添加到类路径中即可解决问题

在邮件列表中,Guillaume Laforge说:

Sql类的使用有一个转折点

它需要您的Groovy类源代码可用——比如在运行Groovy myScript.Groovy时

例如,当一个类被预编译时,“类节点”将不再可用,因为它不存储在字节码中

这可能是你在这里面临的问题

类节点对于
findall{}
部分是必需的,在这里我们访问AST以创建一个临时查询

摘自(第10章,第343页,第4段)——

数据集实现获取Groovy的 关闭代码。这种内部表示称为 抽象语法树(AST),并由Groovy解析器生成。 通过遍历AST(使用访问者模式),数据集 实现发出每个AST节点的SQL等价物


people.findAll{true}
在闭包中不应该有一些条件语句吗?就像
people.findAll{it.age>18}
?@kunal最终不会
it.age>18
计算出一个布尔值?@tim_-yates。你想补充这一点作为答案吗?@kshitizzarma是的,你是对的,我只是在猜测一些可能是错误的方向:)不应该
people.findAll{true}
在结尾处有一些条件语句吗?就像
people.findAll{it.age>18}
?@kunal最终不会
it.age>18
计算出一个布尔值?@tim_-yates。你想补充一下吗?@KshitizSharma是的,你是对的,我只是猜测了一些可能是错误的方向:)有没有可能你知道如何让Eclipse自动将
java
文件复制到
target
?有没有可能你知道如何让Eclipse自动将
java
文件复制到
target