`
acidpie
  • 浏览: 5664 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

一个用hibernate做报表的问题

阅读更多
  本人最近在技术转型过程中,从DELPHI开发平台转到JAVA开发平台。为了到达好的学习效果,我准备改造以前自己用DELPHI做的报表系统。在改造过程中,我决定用Hibernate做为持久化中间件。经过两个星期的学习和开发过程中,发现Hibernate并不适合做报表(也许我对HB的理解还不够吧,希望牛人出来指点一下 )。如下面实例:
  表结构:
create table dbo.owner_serverfee (
owner_no    char(4) not null,
ls_name  varchar(255)    not null,
area_name   varchar(32) null,
incomefee   decimal(14, 2)  not null,
truemonth   char(6) not null,
addfee  decimal(14, 2)  null,
reducefee   decimal(14, 2)  null,
gen_time    datetime    not null,
constraint PK_no_month PRIMARY KEY CLUSTERED (owner_no,ls_name,truemonth )
)

通过MyEclipse生成对应的映射文件和POJO:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
    <class name="com.acidpie.bean.OwnerServerfee" table="owner_serverfee" schema="dbo" catalog="center06">
        <composite-id name="id" class="com.acidpie.bean.OwnerServerfeeId">
            <key-property name="lsName" type="java.lang.String">
                <column name="ls_name" />
            </key-property>
            <key-property name="ownerNo" type="java.lang.String">
                <column name="owner_no" length="4" />
            </key-property>
            <key-property name="truemonth" type="java.lang.String">
                <column name="truemonth" length="6" />
            </key-property>
        </composite-id>
        <property name="areaName" type="java.lang.String">
            <column name="area_name" length="32" />
        </property>
        <property name="incomefee" type="java.lang.Double">
            <column name="incomefee" precision="14" not-null="true" />
        </property>
        <property name="addfee" type="java.lang.Double">
            <column name="addfee" precision="14" />
        </property>
        <property name="reducefee" type="java.lang.Double">
            <column name="reducefee" precision="14" />
        </property>
        <property name="genTime" type="java.util.Date">
            <column name="gen_time" length="23" not-null="true" />
        </property>
    </class>
</hibernate-mapping>


package com.acidpie.bean;

import java.util.Date;


/**
 * OwnerServerfee generated by MyEclipse - Hibernate Tools
 */

public class OwnerServerfee  implements java.io.Serializable {


    // Fields    

     private OwnerServerfeeId id;
     private String areaName;
     private Double incomefee;
     private Double addfee;
     private Double reducefee;
     private Date genTime;


    // Constructors

    /** default constructor */
    public OwnerServerfee() {
    }

	/** minimal constructor */
    public OwnerServerfee(OwnerServerfeeId id, Double incomefee, Date genTime) {
        this.id = id;
        this.incomefee = incomefee;
        this.genTime = genTime;
    }
    
    /** full constructor */
    public OwnerServerfee(OwnerServerfeeId id, String areaName, Double incomefee, Double addfee, Double reducefee, Date genTime) {
        this.id = id;
        this.areaName = areaName;
        this.incomefee = incomefee;
        this.addfee = addfee;
        this.reducefee = reducefee;
        this.genTime = genTime;
    }

   
    // Property accessors

    public OwnerServerfeeId getId() {
        return this.id;
    }
    
    public void setId(OwnerServerfeeId id) {
        this.id = id;
    }

    public String getAreaName() {
        return this.areaName;
    }
    
    public void setAreaName(String areaName) {
        this.areaName = areaName;
    }

    public Double getIncomefee() {
        return this.incomefee;
    }
    
    public void setIncomefee(Double incomefee) {
        this.incomefee = incomefee;
    }

    public Double getAddfee() {
        return this.addfee;
    }
    
    public void setAddfee(Double addfee) {
        this.addfee = addfee;
    }

    public Double getReducefee() {
        return this.reducefee;
    }
    
    public void setReducefee(Double reducefee) {
        this.reducefee = reducefee;
    }

    public Date getGenTime() {
        return this.genTime;
    }
    
    public void setGenTime(Date genTime) {
        this.genTime = genTime;
    }

}




package com.acidpie.bean;

/**
 * OwnerServerfeeId generated by MyEclipse - Hibernate Tools
 */

public class OwnerServerfeeId  implements java.io.Serializable {


    // Fields    

     private String lsName;
     private String ownerNo;
     private String truemonth;


    // Constructors

    /** default constructor */
    public OwnerServerfeeId() {
    }

    
    /** full constructor */
    public OwnerServerfeeId(String lsName, String ownerNo, String truemonth) {
        this.lsName = lsName;
        this.ownerNo = ownerNo;
        this.truemonth = truemonth;
    }

   
    // Property accessors

    public String getlsName() {
        return this.lsName;
    }
    
    public void setlsName(String lsName) {
        this.lsName = lsName;
    }

    public String getOwnerNo() {
        return this.ownerNo;
    }
    
    public void setOwnerNo(String ownerNo) {
        this.ownerNo = ownerNo;
    }

    public String getTruemonth() {
        return this.truemonth;
    }
    
    public void setTruemonth(String truemonth) {
        this.truemonth = truemonth;
    }
   



   public boolean equals(Object other) {
         if ( (this == other ) ) return true;
		 if ( (other == null ) ) return false;
		 if ( !(other instanceof OwnerServerfeeId) ) return false;
		 OwnerServerfeeId castOther = ( OwnerServerfeeId ) other; 
         
		 return ( (this.getlsName()==castOther.getlsName()) || ( this.getlsName()!=null && castOther.getlsName()!=null && this.getlsName().equals(castOther.getlsName()) ) )
 && ( (this.getOwnerNo()==castOther.getOwnerNo()) || ( this.getOwnerNo()!=null && castOther.getOwnerNo()!=null && this.getOwnerNo().equals(castOther.getOwnerNo()) ) )
 && ( (this.getTruemonth()==castOther.getTruemonth()) || ( this.getTruemonth()!=null && castOther.getTruemonth()!=null && this.getTruemonth().equals(castOther.getTruemonth()) ) );
   }
   
   public int hashCode() {
         int result = 17;
         
         result = 37 * result + ( getlsName() == null ? 0 : this.getlsName().hashCode() );
         result = 37 * result + ( getOwnerNo() == null ? 0 : this.getOwnerNo().hashCode() );
         result = 37 * result + ( getTruemonth() == null ? 0 : this.getTruemonth().hashCode() );
         return result;
   }   





}

  现有报表系统对该表进行查询的报表中SQL语句如下

select owner_no,area_name,sum(incomefee),sum(isnull(addfee,0)-isnull(reducefee,0)) from owner_serverfee where truemonth=:month group by owner_no,area_name


我用以下代码
 Query qry=session.createQuery("select ownerNo,areaName,sum(incomefee),sum(isnull(addfee,0)-isnull(reducefee,0)) from OwnerServerfee where trueMonth=:month group by ownerNo,areaName");
  qry.setString("month","200611");    
  List result = qry.list(); 

会出现以下异常
Exception in thread "main" java.lang.IllegalStateException: No data type for node: org.hibernate.hql.ast.tree.IdentNode 
 +-[IDENT] IdentNode: 'ownerNo' {originalText=ownerNo}

	at org.hibernate.hql.ast.tree.SelectClause.initializeExplicitSelectClause(SelectClause.java:140)
	at org.hibernate.hql.ast.HqlSqlWalker.useSelectClause(HqlSqlWalker.java:702)
	at org.hibernate.hql.ast.HqlSqlWalker.processQuery(HqlSqlWalker.java:531)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:645)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:281)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:229)
	at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:218)
	at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:158)
	at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:109)
	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:75)
	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:54)
	at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:71)
	at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
	at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
	at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1583)
	at com.acidpie.business.Test.main(Test.java:32)


我个人分析是因为在针对owner_no,truemonth字段的get和set函数是在OwnerServerfeeId类中定义,而OwnerServerfeeId并没有映射文件。
但是我想了三天也没有解决如何通过hibernate来实现这个报表,如果还不行我只有用JDBC来实现了。


各位牛人!
分享到:
评论
6 楼 leonwoo 2007-05-19  
No data type for node这个错误是因为你在hql欲查询的字段名(对象属性名)和hbm.xml中的属性不匹配或者找不到引起的。
hql中属性名必须和pojo中的属性名一致(区分大小写)。
5 楼 lihy70 2007-03-29  
4 楼 jackey3316 2007-03-25  
查询语句有问题  请用  id.ownerNo  因为你是用组合主键

select id.ownerNo,areaName,sum(incomefee),sum(isnull(addfee,0)-isnull(reducefee,0)) from OwnerServerfee where trueMonth=:month group by ownerNo,areaName

3 楼 acidpie 2007-03-25  
谁能帮我解决一下阿,我可不想出师不利阿
2 楼 dada 2007-03-25  
hibernate确实不适合做复杂的报表,如果是为了学习的目的,建议不要用报表系统上手,概念上不是特别吻合。

ps: composite-id 最好也别用,图增烦恼的玩意儿。
1 楼 wren 2007-03-25  
你的OwnerServerfee中没有ownerNo字段当然会出错,应用连接查询,感觉映射关系没理清. 另复杂的查询可直接用jdbc

相关推荐

    java Hibernate ireport jsperreport 制作报表

    综上所述,通过整合Java的Hibernate、iReport和JasperReport,我们可以构建一个强大的报表系统,能够处理各种复杂的数据查询和展示需求。理解这些工具的核心概念和整合方式对于开发高质量的Java企业应用至关重要。

    struts2+spring+hibernate+生成报表

    在实际开发中,一个可能的流程是这样的:用户通过Struts2发起报表请求,Struts2 Action接收到请求后,利用Spring的依赖注入获取到需要的Service,Service通过Hibernate从数据库获取数据,然后使用Apache POI将数据...

    struts2.0 hibernate spring 报表实例

    其次,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式处理数据。在本实例中,Hibernate将用于从数据库中检索和操作数据,为报表提供数据源。 接着,Spring...

    struts+hibernate做的商城

    本项目是一个基于Struts和Hibernate实现的在线商城系统,具有完整的功能和良好的架构设计。 Struts是一个用于构建MVC(Model-View-Controller)架构的框架,它的主要目标是简化Web应用的开发过程,提高代码的可维护...

    百灵报表 dome mock 实例 hibernate spring struts2 struts

    标题中的“百灵报表 dome mock 实例 hibernate spring struts2 struts”表明这是一个关于集成百灵报表系统(BIRT)与Java后端技术的项目,包括Hibernate ORM框架、Spring框架以及Struts2和Struts的使用。描述进一步...

    在百灵报表BIRT中访问Hibernate POJO

    在百灵报表(BIRT)中访问Hibernate POJO是一个常见的需求,特别是在Java/J2EE Web应用程序中,因为Hibernate提供了一种高效的对象关系映射(ORM)解决方案,使得开发者可以更方便地操作数据库。BIRT(Business ...

    IReport+spring+hibernate

    标题"IReport+spring+hibernate"所涉及的是一个集成开发环境,主要集中在报表生成、企业级应用框架和持久层框架的结合上。这个项目利用了IReport来设计和生成各种类型的报表,同时结合了Spring框架进行业务逻辑管理...

    struts+hibernate做的酒店管理系统 和平酒店管理系统

    综上,"和平酒店管理系统"是一个结合了Struts和Hibernate技术的综合实践,它展示了如何利用这两者构建一个完整的业务系统,涵盖了用户管理、房间管理、订单处理等多个核心模块,为理解和学习Web开发提供了实际案例。

    各种hibernate相关jar包

    Hibernate是一个强大的对象关系映射(ORM)框架,它允许开发人员在Java应用程序中使用面向对象的方式处理数据库操作,从而简化了数据库编程。 描述中的“解压后即可使用”提示我们这些jar包已经准备好直接集成到...

    birt应用hibernate完整实例(下了决不会后悔)

    Hibernate作为一个ORM框架,消除了传统的JDBC编码,使开发人员能够用面向对象的方式操作数据库。它通过映射Java类到数据库表,使得数据库操作变得简单而直观。Hibernate支持自动持久化、事务管理、查询语言HQL...

    ReportX报表控件VB实例

    总结来说,"ReportX报表控件VB实例"为我们提供了一个了解和学习如何在VB环境下使用ReportX创建报表的宝贵资源。通过深入学习和实践,开发者可以掌握在实际项目中运用ReportX报表控件的关键技巧,提升软件的用户体验...

    springmvc+Hibernate配置定时器jar包

    Hibernate是一个对象关系映射(ORM)框架,它简化了Java应用与数据库之间的交互。通过Hibernate,开发者可以使用Java对象来操作数据库,而无需编写SQL语句。Hibernate支持实体类、映射文件(hibernate.cfg.xml或...

    struts2+hibernate汽车租赁系统

    【标题】"Struts2+Hibernate汽车租赁系统"是一个基于Java开源框架的项目,它结合了Struts2和Hibernate这两个强大的技术,旨在实现一个汽车租赁业务的管理平台。这个系统对于初学者来说是一个很好的学习资源,因为它...

    12种优秀开源报表工具整理

    JMagallanes是一个开源的使用Java/J2EE开发的Olap和动态报表应用程序。JMagallanes结合了静态报表(基于JasperReports)、Swing pivot表格(用于OLAP分析),和图表(基于JFreeChart)。它可从多种数据源(如:SQL、...

    struts+hibernate物业管理系统

    Hibernate则是一个对象关系映射(ORM)工具,它简化了数据库操作,使得开发者可以用Java对象来处理数据库事务,而无需编写大量的SQL代码。在物业管理系统中,Hibernate可以用来管理物业信息、业主信息、缴费记录等...

    学生管理系统 JSP+Struts+hibernate

    最后,Hibernate是一个强大的对象关系映射(ORM)框架,它将Java对象与数据库中的表进行绑定,使得开发者可以使用面向对象的方式来操作数据库,而无需关心底层SQL语句。在学生管理系统中,Hibernate帮助我们将学生、...

    hibernate-jar包2 hibernate-jar包2

    总结来说,这个压缩包提供了一个基本的环境,支持使用Hibernate进行数据库操作,同时包含了报表生成工具JasperReports和PDF处理库iText,以及Web服务和动态编译的支持。这些组件组合在一起,可以用于构建一个具备...

    struts1.2+spring+hibernate 简单的实现

    这个项目"struts1.2+spring+hibernate 简单的实现"旨在展示如何整合这三个框架,实现单表和多表的维护,并且包含了一个简单的Excel报表生成功能。 首先,Struts1.2是MVC(模型-视图-控制器)架构模式的一种实现,它...

Global site tag (gtag.js) - Google Analytics