在JasperReports 6.4.0中使用Hibernate 5.2.8时,为什么会出现java.lang.NoSuchMethodError
我正在开发使用ApacheTomcat、Spring和Hibernate的web应用程序项目。它还使用JasperReports v.6.4.0生成pdf报告。最近,Spring和Hibernate的版本从Spring的3.1.2更新为4.3.6,从Hibernate的3.3.1更新为5.2.8 迁移后出现的所有问题都得到了解决,只有一个例外。生成带有hql查询的报告时,会引发以下异常:在JasperReports 6.4.0中使用Hibernate 5.2.8时,为什么会出现java.lang.NoSuchMethodError,java,spring,hibernate,jasper-reports,nosuchmethoderror,Java,Spring,Hibernate,Jasper Reports,Nosuchmethoderror,我正在开发使用ApacheTomcat、Spring和Hibernate的web应用程序项目。它还使用JasperReports v.6.4.0生成pdf报告。最近,Spring和Hibernate的版本从Spring的3.1.2更新为4.3.6,从Hibernate的3.3.1更新为5.2.8 迁移后出现的所有问题都得到了解决,只有一个例外。生成带有hql查询的报告时,会引发以下异常: java.lang.NoSuchMethodError: org.hibernate.Session.cre
java.lang.NoSuchMethodError: org.hibernate.Session.createQuery(Ljava/lang/String;)Lorg/hibernate/Query;
at net.sf.jasperreports.engine.query.JRHibernateQueryExecuter.createQuery(JRHibernateQueryExecuter.java:279)
at net.sf.jasperreports.engine.query.JRHibernateQueryExecuter.createDatasource(JRHibernateQueryExecuter.java:195)
at net.sf.jasperreports.engine.fill.JRFillDataset.createQueryDatasource(JRFillDataset.java:1245)
at net.sf.jasperreports.engine.fill.JRFillDataset.initDatasource(JRFillDataset.java:723)
at net.sf.jasperreports.engine.fill.BaseReportFiller.setParameters(BaseReportFiller.java:438)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:550)
at net.sf.jasperreports.engine.fill.BaseReportFiller.fill(BaseReportFiller.java:396)
at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:90)
at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:456)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:863)
升级之前,JasperReports v.6.4.0与Hibernate v.3.3.1配合得很好。
有人能帮我避免这个问题吗 中的JRHibernateQueryExecuter
不同之处在于,在Hibernate 5.2中,查询类从org.Hibernate移动到org.Hibernate.Query
那么解决方案是什么呢
要使用JRHibernateQueryExecuter,您需要HibernateV。3.3.2类路径中,因此您要么返回,要么开发自己的JRHibernateQueryExecuter和依赖于Hibernate 5.2.8的JRHibernateQueryExecuterFactory
开发自己的JRHibernateQueryExecuter可能不像听起来那么困难,因为,您可能只需要调整导入
要注册新的QueryFactory,请参阅中的JRHibernateQueryExecuter
不同之处在于,在Hibernate 5.2中,查询类从org.Hibernate移动到org.Hibernate.Query
那么解决方案是什么呢
要使用JRHibernateQueryExecuter,您需要HibernateV。3.3.2类路径中,因此您要么返回,要么开发自己的JRHibernateQueryExecuter和依赖于Hibernate 5.2.8的JRHibernateQueryExecuterFactory
开发自己的JRHibernateQueryExecuter可能不像听起来那么困难,因为,您可能只需要调整导入
要注册新的QueryFactory,请参见:我遵循了@PetterFriberg给出的建议,并编写了一个小库,使Hibernate 5与JasperReports 6结合使用成为可能 可在此处找到来源和说明:
我听从了@PetterFriberg的建议,编写了一个小库,可以将Hibernate 5与JasperReports 6结合使用 可在此处找到来源和说明:
一旦创建了自己版本的JRHibernateQueryExecuter&JRHibernateQueryExecuterFactory,就可以通过调用
JasperReportsContext jasperReportsContext = DefaultJasperReportsContext.getInstance();
JRPropertiesUtil jrPropertiesUtil = JRPropertiesUtil.getInstance(jasperReportsContext);
jrPropertiesUtil.setProperty("net.sf.jasperreports.query.executer.factory.hql", "net.sf.jasperreports.engine.query.h5.JRHibernateQueryExecuterFactory");
jrPropertiesUtil.setProperty("net.sf.jasperreports.query.executer.factory.HQL", "net.sf.jasperreports.engine.query.h5.JRHibernateQueryExecuterFactory");
我不知道为什么Jaspersoft自己没有实施修复。正确地开始支持更高版本的hibernate确实是一个简单的改变。一旦创建了自己版本的JRHibernateQueryExecuter&JRHibernateQueryExecuterFactory,就可以通过调用
JasperReportsContext jasperReportsContext = DefaultJasperReportsContext.getInstance();
JRPropertiesUtil jrPropertiesUtil = JRPropertiesUtil.getInstance(jasperReportsContext);
jrPropertiesUtil.setProperty("net.sf.jasperreports.query.executer.factory.hql", "net.sf.jasperreports.engine.query.h5.JRHibernateQueryExecuterFactory");
jrPropertiesUtil.setProperty("net.sf.jasperreports.query.executer.factory.HQL", "net.sf.jasperreports.engine.query.h5.JRHibernateQueryExecuterFactory");
我不知道为什么Jaspersoft自己没有实施修复。正确地开始支持hibernate的较新版本确实是一个简单的改变。@PetterFrisberg,谢谢你的回答,我一定会尝试开发我自己的JRHibernateQueryExecuterFactory,它与hibernate的较新版本兼容。@PetterFrisberg,谢谢你的回答,我一定会尝试开发我自己的JRHibernateQueryExecuterFactory,它与更新的Hibernate版本兼容。