`

Hibernate 多表联查

阅读更多
要给WEB短信群发系统加一个根据时间统计短信发送条数的功能。以前的系统持久层用的Hibernate。对Hibernate也不是很熟悉。分析后一看要多表联查,郁闷!没有玩过Hibernate的多表联查。上网查了一下,通过试验完成任务。趁热总结一下:
如果我有两个表一个User,一个MtLog。关系是User<1-----------*->MtLog。

Hibernate 3.2.5
middlegen 1.3.3
mysql 5.0.17

在数据库中建好表之后用middlegen 自动生成***.hbm.xml文件,有两种方法其中一种是不建立两个表的关系联合查询,另外一种是建立两个表的关系联合查询。首先是不建立两个表的关系联合查询:

User.hbm.xml文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping>
	<!-- 
		Created by the Middlegen Hibernate plugin 2.2
		
		http://boss.bekk.no/boss/middlegen/
		http://www.hibernate.org/
	-->

	<class name="org.apache.eason.Test.User" table="user"
		lazy="false">

		<id name="id" type="java.lang.String" column="ID">

			<generator class="assigned" />
		</id>
......
<property name="fullname" type="java.lang.String"
			column="FULLNAME" not-null="true" length="50" />
......
</class>
</hibernate-mapping>



MtLog.hbm.xml文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping>
	<!-- 
		Created by the Middlegen Hibernate plugin 2.2
		
		http://boss.bekk.no/boss/middlegen/
		http://www.hibernate.org/
	-->

	<class name="org.apache.eason.Test.MtLog" table="mt_log"
		lazy="false">

		<id name="id" type="java.lang.String" column="ID">

			<generator class="assigned" />
		</id>

<property name="userId" column="USER_ID" type="java.lang.String"
			length="32" />

	</class>
</hibernate-mapping>


对应的bean文件就不贴了。有三个bean,User.java、MtLog.java、StatMtLog.java
HibernateTest.java

public class HibernateTest
{
   public static void mian(String [] args)
   {
    .....
    ScrollableResults srs = session
					.createQuery(
						"select u.fullname ,sum(ml.count) from User u , MtLog ml where ml.userId = u.id and ml.mtTime > :minRecordTime and ml.mtTime < :maxRecordTime GROUP BY ml.userId")
					.setString("minRecordTime", minRecordTime + "%").setString("maxRecordTime", maxRecordTime + "%")
					.scroll();
List<StatMtLog> totalList = new ArrayList<StatMtLog>() ;
		while(srs.next())
		{
			totalList.add(new StatMtLog(srs.getString(0),srs.getInteger(1))); 
			}
....

    }


}



下面是建立关系后两表联查的做法

User.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping>
	<!-- 
		Created by the Middlegen Hibernate plugin 2.2
		
		http://boss.bekk.no/boss/middlegen/
		http://www.hibernate.org/
	-->

	<class name="org.apache.eason.Test.User" table="user"
		lazy="false">

		<id name="id" type="java.lang.String" column="ID">

			<generator class="assigned" />
		</id>
......
<property name="fullname" type="java.lang.String"
			column="FULLNAME" not-null="true" length="50" />
......
/* user-1--*->mtlog:一对多的关系 */
<set name="mtLogs" lazy="true" inverse="true" cascade="all">
	<key>
	        <column name="USER_ID" />
	</key>
   <one-to-many class="org.apache.eason.Test.MtLog" />
</set>
	</class>
</hibernate-mapping>


MtLog.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping>
	<!-- 
		Created by the Middlegen Hibernate plugin 2.2
		
		http://boss.bekk.no/boss/middlegen/
		http://www.hibernate.org/
	-->

	<class name="org.apache.eason.Test.MtLog" table="mt_log"
		lazy="false">

		<id name="id" type="java.lang.String" column="ID">

			<generator class="assigned" />
		</id>

......
/* mtlog-*--1->user:多对一的关系 */
<many-to-one name="user" class="org.apache.eason.Test.User"
			not-null="true">
			<column name="USER_ID" />
		</many-to-one>

	</class>
</hibernate-mapping>




这样建立关联关系后,要修改一下查询语句

select u.fullname ,sum(u.mtLogs.count) from User u GROUP BY u.fullname
注意红色部分。
分享到:
评论
2 楼 liucl_tiger 2008-10-28  
你那红色部分是什么?
1 楼 yuan_2004 2008-10-25  
感谢你的红色部分...

相关推荐

    hibernate多表联合查询

    ### Hibernate多表联合查询详解 #### 一、引言 在实际项目开发中,我们经常需要处理复杂的数据库查询,特别是涉及到多个表之间的关联查询。Hibernate作为一款流行的Java持久层框架,提供了一种非常便捷的方式来处理...

    SpringBoot多表联查(测试可用)

    在Spring Boot应用中,进行多表联查是一个常见的需求,特别是在数据处理和业务逻辑复杂的场景。Spring Data JPA,作为Spring Boot的一个重要组件,提供了一种便捷的方式来处理数据库的CRUD操作,包括多表联查。本文...

    JDBC与Hibernate区别

    JDBC的灵活性很高,对于复杂的数据操作,如多表联查和事务处理,JDBC往往更加高效。然而,由于直接操作SQL,它的学习曲线相对较陡峭,且需要手动处理资源关闭和事务管理等问题,增加了代码的繁琐程度。 相比之下,...

    Hibernate3教程

    通过以上步骤,我们可以成功地在Myeclipse环境中搭建基于Hibernate3的数据库操作框架,并实现了基本的CRUD操作及多表联查等功能。这不仅有助于提高开发效率,还能够让应用程序更好地利用数据库资源。

    hibernate关系映射多对多关系

    此外,`多表联查`涉及到多个表的数据查询,这是Hibernate的HQL(Hibernate Query Language)或Criteria API的主要用途。它们允许开发者编写类似SQL的查询,但更加面向对象,可以轻松地处理复杂的多表查询。 最后,`...

    hibernate将本地SQL查询结果封装成对象

    对于复杂查询,可能涉及到多表联查,此时可以使用`addJoin()`方法指定JOIN条件,并通过`addScalar()`将每列映射到对应的属性: ```java query.addJoin("table2", "t2"); query.addScalar("t2.column1", Hibernate....

    Hibernate各种查询:联表查询 分页查询 位置参数查询(?) 占位符查询(冒号查询) 统计查询

    在Hibernate中,可以使用`Criteria` API或者`HQL`(Hibernate Query Language)来实现多表联查。`Criteria` API提供了更加面向对象的查询方式,通过`createCriteria()`方法指定主表,然后使用`createAlias()`方法...

    hibernate例子

    **Hibernate 框架详解与实例应用** Hibernate 是一个开源的 Java 库,它作为对象关系映射(ORM)框架,极大地简化了...在实际项目中,还可以结合缓存、多表联查、级联操作等高级特性,实现更为复杂的数据管理需求。

    ( Test多表联合增删改查,struts两个JAVABEAN.rar

    在这个"Test多表联合增删改查,struts两个JAVABEAN.rar"压缩包中,我们可以推测其包含的内容是关于使用Struts进行多表联合操作的示例,以及两个相关的JavaBean类。 首先,多表联合查询在数据库操作中很常见,特别是...

    管理系统easyUI+Struts2+hibernate

    在Hibernate中,可以通过建立实体类之间的关联关系来实现两表联查,例如一对一、一对多、多对一、多对多关系。在本系统中,可能涉及到如用户表和权限表的联查,以便实现用户角色和权限的分配。通过Hibernate的...

    Hibernate性能优化

    7. **减少笛卡尔积**:在多表联查时,避免无连接条件导致的笛卡尔积。使用JOIN或子查询来限制返回结果的数量。 8. **使用投影(Projection)**:通过使用Criteria的List()或Projections,只获取需要的字段,减少...

    struts2+hibernate的大学社团管理系统

    3. **活动管理**:发布、报名、审批活动,可能涉及到多表联查和复杂业务逻辑,这需要Struts2和Hibernate协同工作。 4. **新闻公告**:发布、查看社团动态,可能使用Struts2的Tiles插件来实现页面布局。 5. **统计...

    MyClipse6.0\Struts2,Spring与Hibernate整合应用,学生成绩管理系统

    - **学生成绩管理**:添加、修改、删除和查询学生成绩,涉及到多表联查和事务处理,Spring的事务管理在此环节尤为重要。 - **分页功能**:在展示大量数据时,分页可以提高用户体验。这需要在Action层处理分页逻辑...

    hibernate3.2

    在3.2版本中,HQL的功能更加完善,可以执行更复杂的查询,包括子查询和多表联查。 3. **Criteria 查询**:除了HQL,Hibernate 3.2还提供了Criteria API,它允许开发者动态构建查询,无需预先编写查询语句,更加灵活...

    hibernate_api_3.5.5GA

    两者都能实现复杂的多表联查、分组、排序等功能。 Entity和Association Mapping是Hibernate的核心概念。在3.5.5GA版本中,Hibernate支持多种关联映射,如一对一(@OneToOne)、一对多(@OneToMany)、多对一(@...

    青鸟租房系统关联映射

    在IT行业中,关联映射是软件设计中的一个重要概念,特别是在对象关系映射(ORM)框架中,如Java的Hibernate或.NET的Entity Framework。关联映射是将数据库中的表与对象模型之间的关系进行定义和建立的过程,它使得...

    Hibernate参考大全

    HQL可以方便地进行复杂的查询,支持多表联查、分页、排序等功能。 6. ** Criteria查询** Criteria API是一种更加动态的查询方式,允许在运行时构建查询条件。它提供了更强大的查询能力,适合于动态生成查询的场景...

    Hibernate3.2官方中文参考手册

    2. 查询技巧:包括单表查询、多表联查、分页查询、条件查询、排序和分组等。 六、Criteria API 1. Criteria API提供了一种更加面向对象的查询方式,无需编写HQL字符串,更安全且易于维护。 2. 使用示例:...

Global site tag (gtag.js) - Google Analytics