Hibernate 和 Lambdaj 的分组问题
Hibernate and Lambdaj issue with grouping
我想使用 Lambdaj 从查询结果集中执行树分组。结果来自 Hibernate。
我可以成功进行聚合,但是代码在分组时失败了:
List<MyClass> list = myDao.findByProperty(value);
Integer intAvg = avg(list, on(MyClass.class).getIntProperty()); //OK
Group<MyClass> group = group(list, on(MyClass.class).getGroupingStringProperty()); //FAIL
例外是
ch.lambdaj.util.IntrospectionException: java.lang.NoSuchMethodException: org.example.entityMyClass.-2147483644()
at ch.lambdaj.util.IntrospectionUtil.getPlainPropertyValue(IntrospectionUtil.java:61)
at ch.lambdaj.util.IntrospectionUtil.getBooleanPropertyValue(IntrospectionUtil.java:53)
at ch.lambdaj.util.IntrospectionUtil.getPropertyValue(IntrospectionUtil.java:45)
at ch.lambdaj.group.StringGroupCondition.getGroupValue(StringGroupCondition.java:41)
at ch.lambdaj.group.GroupImpl.addItem(GroupImpl.java:28)
at ch.lambdaj.group.Groups.group(Groups.java:58)
at ch.lambdaj.group.Groups.group(Groups.java:46)
at ch.lambdaj.Lambda.group(Lambda.java:1237)
at org.example.package.Class.method(Class.java:128)
...............
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:190)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NoSuchMethodException: org.example.entityMyClass.-2147483644()
at java.lang.Class.getMethod(Class.java:1665)
at ch.lambdaj.util.IntrospectionUtil.getPlainPropertyValue(IntrospectionUtil.java:59)
... 91 more
我试着做了一些功课,暂时没有成功。
Lambdaj 使用 cglib
执行代理。 Ivy 文件提供了一个 cglib-nodep.jar
包。我们的架构项目功能(由于与 Hibernate 的依赖性)cglib
标准版本和 asm-all
。请注意,由于公司政策,我们的 Ivy 依赖文件不允许传递依赖,依赖由开发团队根据项目的实际需求决定(因此如果 Hibernate 需要某个版本的 cglib
,我们将这种依赖性放入 Ivy 并将所有内容标记为不可传递的)。
所以在我的项目中我有<dependency org="com.googlecode.lambdaj" name="lambdaj" rev="2.3.3"/>
(默认传递真)和我的项目所依赖的建筑项目有
<dependency org="org.ow2.asm" name="asm-all" rev="4.0" transitive="false"/>
<dependency org="org.hibernate" name="hibernate-core" rev="4.1.6.Final" transitive="false"/>
<dependency org="org.hibernate" name="hibernate-ehcache" rev="4.1.6.Final" transitive="false"/>
<dependency org="org.hibernate" name="hibernate-validator" rev="4.3.0.Final" transitive="false"/>
<dependency org="org.hibernate.javax.persistence" name="hibernate-jpa-2.0-api" rev="1.0.1.Final" transitive="false"/>
(还有更多)
问题是:我在代码中做错了什么吗?这是 Hibernate 的问题吗?
小错误
必须调用 API 而不是
Group<MyClass> group = group(list, on(MyClass.class).getGroupingStringProperty());
而是
Group<MyClass> group = group(list, by(on(MyClass.class).getGroupingStringProperty()));
注意group
...by
语法
我想使用 Lambdaj 从查询结果集中执行树分组。结果来自 Hibernate。
我可以成功进行聚合,但是代码在分组时失败了:
List<MyClass> list = myDao.findByProperty(value);
Integer intAvg = avg(list, on(MyClass.class).getIntProperty()); //OK
Group<MyClass> group = group(list, on(MyClass.class).getGroupingStringProperty()); //FAIL
例外是
ch.lambdaj.util.IntrospectionException: java.lang.NoSuchMethodException: org.example.entityMyClass.-2147483644()
at ch.lambdaj.util.IntrospectionUtil.getPlainPropertyValue(IntrospectionUtil.java:61)
at ch.lambdaj.util.IntrospectionUtil.getBooleanPropertyValue(IntrospectionUtil.java:53)
at ch.lambdaj.util.IntrospectionUtil.getPropertyValue(IntrospectionUtil.java:45)
at ch.lambdaj.group.StringGroupCondition.getGroupValue(StringGroupCondition.java:41)
at ch.lambdaj.group.GroupImpl.addItem(GroupImpl.java:28)
at ch.lambdaj.group.Groups.group(Groups.java:58)
at ch.lambdaj.group.Groups.group(Groups.java:46)
at ch.lambdaj.Lambda.group(Lambda.java:1237)
at org.example.package.Class.method(Class.java:128)
...............
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:190)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NoSuchMethodException: org.example.entityMyClass.-2147483644()
at java.lang.Class.getMethod(Class.java:1665)
at ch.lambdaj.util.IntrospectionUtil.getPlainPropertyValue(IntrospectionUtil.java:59)
... 91 more
我试着做了一些功课,暂时没有成功。
Lambdaj 使用 cglib
执行代理。 Ivy 文件提供了一个 cglib-nodep.jar
包。我们的架构项目功能(由于与 Hibernate 的依赖性)cglib
标准版本和 asm-all
。请注意,由于公司政策,我们的 Ivy 依赖文件不允许传递依赖,依赖由开发团队根据项目的实际需求决定(因此如果 Hibernate 需要某个版本的 cglib
,我们将这种依赖性放入 Ivy 并将所有内容标记为不可传递的)。
所以在我的项目中我有<dependency org="com.googlecode.lambdaj" name="lambdaj" rev="2.3.3"/>
(默认传递真)和我的项目所依赖的建筑项目有
<dependency org="org.ow2.asm" name="asm-all" rev="4.0" transitive="false"/>
<dependency org="org.hibernate" name="hibernate-core" rev="4.1.6.Final" transitive="false"/>
<dependency org="org.hibernate" name="hibernate-ehcache" rev="4.1.6.Final" transitive="false"/>
<dependency org="org.hibernate" name="hibernate-validator" rev="4.3.0.Final" transitive="false"/>
<dependency org="org.hibernate.javax.persistence" name="hibernate-jpa-2.0-api" rev="1.0.1.Final" transitive="false"/>
(还有更多)
问题是:我在代码中做错了什么吗?这是 Hibernate 的问题吗?
小错误
必须调用 API 而不是
Group<MyClass> group = group(list, on(MyClass.class).getGroupingStringProperty());
而是
Group<MyClass> group = group(list, by(on(MyClass.class).getGroupingStringProperty()));
注意group
...by
语法