`
tolys
  • 浏览: 116106 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

hibernate 多表(三表)一对多(联合主键)关联查询

阅读更多
TblEnter  (1..N) TblEva  (1..N) TblEvaMember
  A                 B                C
三表中各有搜索条件 TBL_A.XXX.. TBL_B.XXX.. TBL_C.XXX.. (A和B通过一个主键关联 ,B和C通过两个联合主键关联)

要求页面显示 :

TBL_A.id 1
    TBL_B.id1  TBL_B.XXX
    TBL_B.id2  TBL_B.XXX
    TBL_B.id3  TBL_B.XXX
TBL_A.id 2
    TBL_B.id1  TBL_B.XXX
    TBL_B.id2  TBL_B.XXX 
TBL_A.id 3
    TBL_B.id1  TBL_B.XXX
    TBL_B.id2  TBL_B.XXX
    ...

求HQL 或者 SQL实现!
有空的加我MSN:hundsunlin@hotmail.com

映射关系如下:实体Bean略 用Set表示一对多

<hibernate-mapping>
	<class name="jp.go.mlit.eva.domain.TblEnter" table="TBL_ENTER"
		schema="dbo" catalog="evadb">
		<id name="enterId" type="java.lang.String">
			<column name="ENTER_ID" length="5" />
			<generator class="assigned" />
		</id>
		<many-to-one name="mstOrgByEvaOrg"
			class="jp.go.mlit.eva.domain.MstOrg" fetch="select">
			<column name="EVA_ORG" length="2" not-null="true" />
		</many-to-one>
		<many-to-one name="mstPref"
			class="jp.go.mlit.eva.domain.MstPref" fetch="select">
			<column name="PREFECTURE" length="2" not-null="true" />
		</many-to-one>
		<many-to-one name="mstMode"
			class="jp.go.mlit.eva.domain.MstMode" fetch="select">
			<column name="MODE" length="2" not-null="true" />
		</many-to-one>
		<many-to-one name="mstOrgByJuris"
			class="jp.go.mlit.eva.domain.MstOrg" fetch="select">
			<column name="JURIS" length="2" not-null="true" />
		</many-to-one>
		<property name="enterName" type="java.lang.String">
			<column name="ENTER_NAME" length="200" not-null="true" />
		</property>
		<property name="lastName" type="java.lang.String">
			<column name="LAST_NAME" length="20" />
		</property>
		<property name="firstName" type="java.lang.String">
			<column name="FIRST_NAME" length="20" />
		</property>
		<property name="address" type="java.lang.String">
			<column name="ADDRESS" length="400" />
		</property>
		<property name="url" type="java.lang.String">
			<column name="URL" length="100" />
		</property>
		<property name="deleteFlg" type="java.lang.String">
			<column name="DELETE_FLG" length="1" not-null="true" />
		</property>
		<property name="updatetime" type="java.util.Date">
			<column name="UPDATETIME" length="23" />
		</property>
		<set name="tblEvas" inverse="true">
			<key>
				<column name="ENTER_ID" length="5" not-null="true" />
			</key>
			<one-to-many class="jp.go.mlit.eva.domain.TblEva" />
			<filter name="filterEvas"
				condition="ENTER_ID=:tblEnterId and EVA_ID= :tblEvaId" />
		</set>

		<property name="countEvaInfo"
			formula="(SELECT COUNT(*) FROM TBL_EVA AS t   WHERE  
        	         t.ENTER_ID = ENTER_ID
        	  AND t.DELETE_FLG = 0    
        	  AND t.EVA_DATE &lt;= Getdate()
        	  AND t.EVA_RPT IS NOT NULL  	      	 
        	  )">
		</property>

	</class>

	<filter-def name="filterEvas">
		<filter-param name="tblEnterId" type="java.lang.String" />
		<filter-param name="tblEvaId" type="java.lang.String" />
	</filter-def>

</hibernate-mapping>



<hibernate-mapping>
	<class name="jp.go.mlit.eva.domain.TblEva" table="TBL_EVA"
		schema="dbo" catalog="evadb">
		<composite-id name="id"
			class="jp.go.mlit.eva.domain.TblEvaId">
			<key-many-to-one name="tblEnter"
				class="jp.go.mlit.eva.domain.TblEnter">
				<column name="ENTER_ID" length="5" />
			</key-many-to-one>
			<key-property name="evaId" type="java.lang.String">
				<column name="EVA_ID" length="3" />
			</key-property>
		</composite-id>
		<many-to-one name="mstOrgByEvaOrg"
			class="jp.go.mlit.eva.domain.MstOrg" fetch="select">
			<column name="EVA_ORG" length="2" />
		</many-to-one>
		<many-to-one name="mstPref"
			class="jp.go.mlit.eva.domain.MstPref" fetch="select">
			<column name="PREFECTURE" length="2" />
		</many-to-one>
		<many-to-one name="mstMode"
			class="jp.go.mlit.eva.domain.MstMode" fetch="select">
			<column name="MODE" length="2" />
		</many-to-one>
		<many-to-one name="mstOrgByJuris"
			class="jp.go.mlit.eva.domain.MstOrg" fetch="select">
			<column name="JURIS" length="2" />
		</many-to-one>
		<property name="enterName" type="java.lang.String">
			<column name="ENTER_NAME" length="200" not-null="true" />
		</property>
		<property name="lastName" type="java.lang.String">
			<column name="LAST_NAME" length="20" />
		</property>
		<property name="firstName" type="java.lang.String">
			<column name="FIRST_NAME" length="20" />
		</property>
		<property name="address" type="java.lang.String">
			<column name="ADDRESS" length="400" />
		</property>
		<property name="url" type="java.lang.String">
			<column name="URL" length="100" />
		</property>
		<property name="evaDateDiv" type="java.lang.String">
			<column name="EVA_DATE_DIV" length="1" />
		</property>
		<property name="evaDate" type="java.lang.String">
			<column name="EVA_DATE" length="23" />
		</property>
		<property name="evaRpt"
			type="org.springframework.orm.hibernate3.support.BlobByteArrayType">
			<column name="EVA_RPT" length="1073741823" />
		</property>
		<property name="evaRptUpdater" type="java.lang.String">
			<column name="EVA_RPT_UPDATER" length="92" />
		</property>
		<property name="evaRptUpdatetime" type="java.util.Date">
			<column name="EVA_RPT_UPDATETIME" length="23" />
		</property>
		<property name="deleteFlg" type="java.lang.String">
			<column name="DELETE_FLG" length="1" not-null="true" />
		</property>
		<property name="updatetime" type="java.util.Date">
			<column name="UPDATETIME" length="23" />
		</property>
		<set name="tblEvaMembers" inverse="true">
			<key>
				<column name="ENTER_ID" length="5" not-null="true" />
				<column name="EVA_ID" length="3" not-null="true" />
			</key>
			<one-to-many class="jp.go.mlit.eva.domain.TblEvaMember" />
			<filter name="filterMembers"
				condition="EVA_MEMBER_ID=:memberId" />
		</set>
		<set name="tblEvaInfos" inverse="true">
			<key>
				<column name="ENTER_ID" length="5" not-null="true" />
				<column name="EVA_ID" length="3" not-null="true" />
			</key>
			<one-to-many class="jp.go.mlit.eva.domain.TblEvaInfo" />
		</set>

        <property name="countEvaRelateFile" 
        	 formula = "(
        	   SELECT COUNT(ei.ENTER_ID) 
				  FROM TBL_EVA_INFO ei
			     WHERE ei.DIVISION = 01
			         AND ei.ENTER_ID = ENTER_ID
			         AND ei.EVA_ID = EVA_ID
  		           )">
		</property>
		<property name="countEvaResultFile"
			formula="(
        	   SELECT 
        	   CASE WHEN EVA_RPT IS NOT NULL 
        	   THEN COUNT(ei.ENTER_ID)+1
        	   ELSE COUNT(ei.ENTER_ID)
        	   END
				  FROM TBL_EVA_INFO ei
			    WHERE ei.DIVISION = 02
			        AND ei.ENTER_ID = ENTER_ID
			        AND ei.EVA_ID = EVA_ID
  		           )">
		</property>
	</class>

	<filter-def name="filterMembers">
		<filter-param name="memberId" type="java.lang.String" />
	</filter-def>
</hibernate-mapping>


<hibernate-mapping>
    <class name="jp.go.mlit.eva.domain.TblEvaMember" table="TBL_EVA_MEMBER">
        <composite-id name="id" class="jp.go.mlit.eva.domain.TblEvaMemberId">
            <key-many-to-one name="tblEva" class="jp.go.mlit.eva.domain.TblEva">
                <column name="ENTER_ID" length="5" />
                <column name="EVA_ID" length="3" />
            </key-many-to-one>
            <key-many-to-one name="tblUser" class="jp.go.mlit.eva.domain.TblUser">
                <column name="EVA_MEMBER_ID" />
            </key-many-to-one>
        </composite-id>
        <property name="dspBelong" type="java.lang.String">
            <column name="DSP_BELONG" length="50" not-null="true" />
        </property>
        <property name="dspAuthority" type="java.lang.String">
            <column name="DSP_AUTHORITY" length="10" not-null="true" />
        </property>
        <property name="dspMode" type="java.lang.String">
            <column name="DSP_MODE" length="12" />
        </property>
        <property name="dspUserLastname" type="java.lang.String">
            <column name="DSP_USER_LASTNAME" length="20" not-null="true" />
        </property>
        <property name="dspUserFirstname" type="java.lang.String">
            <column name="DSP_USER_FIRSTNAME" length="20" not-null="true" />
        </property>
        <property name="leaderFlg" type="java.lang.String">
            <column name="LEADER_FLG" length="1" not-null="true" />
        </property>
        <property name="updatetime" type="java.util.Date">
            <column name="UPDATETIME" length="23" />
        </property>
    </class>
</hibernate-mapping>


分享到:
评论
4 楼 yangtao309 2008-11-05  
这是hibernate 几啊? 多长时间没搞hibernate了...
3 楼 流浪者A 2008-11-05  
给个简单说明就差不多了·
2 楼 zhongxy0000 2008-10-31  
好复杂。。。
1 楼 tolys 2008-03-06  
自己顶 一下!

相关推荐

    Hibernate一对一单向外键关联 (联合主键annotation)

    本篇将详细讲解如何使用Hibernate进行一对一单向外键关联,并且该关联涉及到联合主键的注解配置。 首先,一对一关联可以分为两种类型:单向和双向。在单向一对一关联中,只有一个实体知道另一个实体的存在,而另一...

    Hibernate 系列教程 单向一对多

    在数据库设计中,一对多关系意味着一个父表记录可以与多个子表记录相关联。例如,一个学生可以有多个课程,或者一个部门可以有多名员工。在Hibernate中,这种关系可以通过配置XML映射文件或使用注解来实现。 首先,...

    hibernate的联合主键怎么设置

    例如,在学生(Student)和教师(Teacher)的多对多关系中,使用一个中间表(TeacherStudent)来存储关联。如果 Student 的 `inverse="true"`,那么添加一个新的 Student 时,Hibernate 不会在 TeacherStudent 表中...

    Hibernate ORM - 多对多双向连接表关联关系

    本文将深入探讨Hibernate ORM中的一个关键概念——多对多双向连接表关联关系。这种关联关系在实际业务场景中非常常见,比如用户与角色、课程与学生等例子,都需要用到多对多的关系来描述它们之间的复杂联系。 首先...

    Hibernate之一对多关联

    综上所述,Hibernate的一对多关联映射是实现Java对象与数据库表之间关系的关键特性。正确配置和使用它可以极大地简化开发工作,并提升应用程序的性能。通过深入理解这些概念,开发者能够更好地掌控Hibernate,从而在...

    Hibernate表关系总结(一对一,多对一,多对多)

    2. **联合主键关联** - 当两个表共享一个主键时,可以使用联合主键实现一对一关系。联合主键类需要实现`Serializable`接口,并重写`equals`和`hashCode`方法。 ```java @Entity @Table(name = "_husband") public ...

    Hibernate多表查询.txt

    这包括一对一、一对多和多对多等多种类型,不同的关联关系会影响查询语句的编写和执行效率。 - **优化查询性能**:多表查询可能涉及大量数据的读取和处理,因此性能优化是不容忽视的一环。合理设计查询语句,避免...

    Hibernate多对多实例+数据库代码

    3. **中间表的配置**:创建一个无意义的联合主键,通常由两个外键组成,分别对应两个参与关联的实体的主键。 4. **关联注解**:在两个实体类中,使用`@ManyToMany`注解来指定关联,同时通过`@JoinTable`注解来定义...

    Hibernate教程08_关系映射之联合主键

    例如,在`s2sh_relation05_one2one_uni_fk_composite`的示例中,假设我们有一个`Student`实体和一个`Address`实体,它们之间存在一对一(One-to-One)的关系,并且`Address`使用联合主键。`Address`实体的主键可能...

    Hibernate关联关系总结

    本篇文章将深入探讨Hibernate中的三种主要关联关系:一对一、一对多和多对多。 **一对一关联(One-to-One)** 一对一关联在现实生活中很常见,例如一个人只有一个身份证。在Hibernate中,这种关联可以通过`@...

    hibernate组件之间的关联

    在 Hibernate 中,组件之间的关联是实现对象模型与数据库表之间映射的关键部分,它包括了一对一、一对多、多对一、多对多等多种关联类型。本篇文章将深入探讨 Hibernate 组件之间的关联机制及其应用。 **一对一关联...

    Hibernate关联关系配置

    #### 三、自身一对多关系配置示例 自身一对多关系是指一个实体与自身形成的一对多关系,例如目录树结构。这里给出一个简单的配置示例: ```xml &lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate ...

    hibernate各种常用关联关系的基本配置

    二、一对多(OneToMany)关联 一个实体可以与多个其他实体相关联,如用户和订单。配置时使用`@OneToMany`注解,可设置`mappedBy`、`fetch`(默认为EAGER,可改为LAZY实现懒加载)和`cascade`(级联操作)等属性。 ...

    hibernate关联关系映射

    在一个实体中,如果一个实例可以对应多个其他实体的实例,这就是一对多关系。在Hibernate中,我们使用`@OneToMany`注解来表示。例如,一个部门可以有多个员工,Department类和Employee类可以通过`@OneToMany`进行...

    Hibernate 的关联映射

    "Hibernate的关联映射"是Hibernate中的核心概念之一,用于模拟数据库中的关系,包括一对一(One-to-One)、一对多(One-to-Many)、多对一(Many-to-One)和多对多(Many-to-Many)四种关系。现在,让我们详细探讨...

    Hibernate关联关系疑问

    在ORM中,关联关系是数据库表之间的连接,如一对一、一对多、多对一和多对多关系。 1. **一对一关联(OneToOne)**:这种关系意味着一个实体仅与另一个实体的一个实例相关联。在Hibernate中,可以通过@OneToOne注解...

    SSH2+JSO与三表联合主外键

    在描述中提到的“三表联合主键”,意味着可能涉及三个表的相互关联,每个表都有自己的主键,并且这些主键组合在一起形成了一个联合主键。这通常发生在复杂的关系型数据库设计中,例如在实现多对多关系或者需要更严格...

    Hibernate多对一

    1. **联合主键**:当多对一关联的唯一性基于多个字段时,可以使用联合主键。 2. **二级缓存**:对于经常被查询的数据,可以开启二级缓存,进一步提升性能。 3. **避免N+1查询问题**:在批量操作或集合查询时,如果不...

    hibernate之关于关联映射的综合应用

    - **一对多关联**:学生和分数表,课程和分数表之间是一对多关系,因为一个学生有多条分数记录,一门课程也有多个学生的分数。在Java类中,通过`@OneToMany`注解实现,`mappedBy`属性用于指定维护端,即谁负责更新...

Global site tag (gtag.js) - Google Analytics