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)

私の知る限り、これは私のコンストラクターが間違っていることを意味します。public に設定されており、空です。ここで他に何をする必要があるのか​​ わかりませんか?

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

pgadmin から実行すると、SQL クエリは正常に機能します。ここでは、クラス プロパティが camelCased であるため、すべてのフィールドを addScalar で設定します。次に、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 を使用したことはありませんでした。これは大きなコードベースです。これは、私が犯している初歩的な間違いかもしれません。

4

1 に答える 1

10

実際、このインスタンス化は、インスタンス化されたクラスが内部クラスでない場合にのみ実行できます...

内部クラスを通常のクラスにリファクタリングするか、静的にすることができます。

これが少し役立つことを願っています:)!

于 2014-06-26T18:12:26.077 に答える