2013-02-04 51 views
3

我有一个SQL查询,我想映射到一个类。我使用Hibernate的createSQLQuery,然后使用Result Transformer作为我想要映射到的类。但休眠抛出这个错误:Hibernate结果转换器无法实例化结果类

ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/mypackage].[MyPackageServlet]] 
Servlet.service() for servlet MyPackageServlet threw exception org.hibernate.HibernateException: 
Could not instantiate resultclass: com.myapp.mypackage.context.report.MonthlyReportContext$MonthlyReport   
at org.hibernate.transform.AliasToBeanResultTransformer.transformTuple(AliasToBeanResultTransformer.java:69) 

从我可以告诉,这意味着我的构造函数是错误的。它是公开的,它是空的。不知道我还需要在这里做什么?从pgAdmin的运行时

public class MonthlyReport 
{ 
     /** Some private properties defined here **/ 
     public MonthlyReport(){} 
     /** setters and getters for all properties here **/ 
    }   

的SQL查询工作正常。在这里,我使用addScalar设置所有字段,因为类属性是camelCased。然后我使用setResultTransformer:

Query query = this.getSession().createSQLQuery(sql) 
      .addScalar("policy", Hibernate.STRING) 
      .addScalar("memberName", Hibernate.STRING) 
      .addScalar("premium", Hibernate.BIG_DECIMAL) 
      .addScalar("effectiveDate", Hibernate.DATE) 
      .addScalar("newOrRenewal", Hibernate.CHARACTER) 
      .addScalar("auditPayment", Hibernate.BIG_DECIMAL) 
      .addScalar("auditRecieveable", Hibernate.BIG_DECIMAL) 
      .addScalar("associationDues", Hibernate.BIG_DECIMAL) 
      .addScalar("expenseConstant", Hibernate.BIG_DECIMAL) 
      .addScalar("nsfFees", Hibernate.BIG_DECIMAL) 
      .addScalar("lossControl", Hibernate.BIG_DECIMAL) 
      .addScalar("premiumPayment", Hibernate.BIG_DECIMAL) 
      .addScalar("totalPaid", Hibernate.BIG_DECIMAL) 
      .addScalar("month", Hibernate.STRING) 
      .addScalar("installment", Hibernate.STRING) 
      .setResultTransformer(new AliasToBeanResultTransformer(MonthlyReport.class)); 
    List<MonthlyReport> monthlyReport = query.setString("month", month) 
      .setString("startPayDate", month + "/" + cal.getActualMinimum(Calendar.DAY_OF_MONTH) + "/" + year) 
      .setString("endPayDate", month + "/" + cal.getActualMaximum(Calendar.DAY_OF_MONTH) + "/" + year) 
      .setString("fundYear", fundYear) 
      .list(); 

任何帮助,非常感谢。我继承了这个项目,之前从未使用Java或Hibernate,这是一个很大的代码库。这很可能是我正在犯的新人错误。

+0

是MonthlyReport内部类吗? MonthlyReportContext $ MonthlyReport? – kosa

+0

是的,这是一个内部类。 –

+0

我不确定Hibernate如何与Inner类一起工作,如果可能的话,我会将它作为外部类并尝试。 – kosa

回答

8

事实上,这个实例可以只有当实例化类不是一个内部类...

您可以重构内部类为正常类或使其静态完成。

希望这有助于一点:)!

+1

静态和公共 – denispyr