两个两映射文件:<?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 Persistence Tools
-->
<hibernate-mapping package="com.creditms.msg.entity.po">
    <class name="TSendplat" table="T_SEND_PLAT">
        <id name="id" type="java.lang.Long">
            <column name="ID" precision="9" scale="0" />
            <generator class="sequence">
            <param name="sequence">SQ_CM_SENDPLAT</param>
            </generator>
        </id>
        <property name="SNumber" type="java.lang.String">
            <column name="S_NUMBER" length="100" />
        </property>
        <property name="fromOrg"  type="java.lang.String" length="100">
            <column name="FROM_ORG" />
        </property>
        
    <property name="surrenderOrg"  type="java.lang.String" length="100">
            <column name="SURRENDER_ORG" />
        </property>
    <property name="surrenderName"  type="java.lang.String" length="100">
            <column name="SURRENDER_NAME" />
        </property>
<property name="sendDate"  type="java.util.Date" length="100">
            <column name="SEND_DATE" />
        </property>
    <property name="fromOrgName"  type="java.lang.String" length="100">
            <column name="FROM_ORG_NAME" />
        </property>
        <property name="title"  type="java.lang.String" length="100">
            <column name="TITLE" />
        </property>
         <property name="status"  type="java.lang.String" length="1">
            <column name="STATUS" />
        </property>
    <property name="surrenderNumber"  type="java.lang.String" length="100">
            <column name="SURRENDER_NUMBER" />
        </property>
    <property name="surrenderContent"  type="java.lang.String" length="400">
            <column name="SURRENDER_CONTENT" />
        </property>
        <set name="TSendplatDetails" inverse="false" cascade="all">
            <key>
                <column name="S_ID" precision="9" scale="0" not-null="true" />
            </key>
            <one-to-many class="TSendDetail" />
        </set>
    </class>
</hibernate-mapping>
<?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 Persistence Tools
-->
<hibernate-mapping package="com.creditms.msg.entity.po">
    <class name="TSendDetail" table="T_SEND_DETAIL">
        <id name="id" type="java.lang.Long">
            <column name="ID" precision="9" scale="0" />
            <generator class="sequence">
            <param name="sequence">SQ_CM_SENDPLATDETAIL</param>
            </generator>
        </id>
        <many-to-one name="TSendplat" class="TSendplat" fetch="select">
            <column name="S_ID" precision="9" scale="0" not-null="true" />
        </many-to-one>
        <property name="toOrg"  type="java.lang.String" length="100">
            <column name="TO_ORG" />
        </property>
        <property name="toOrgName"  type="java.lang.String" length="100">
            <column name="TO_ORG_NAME" />
        </property>
    <property name="isRead"  type="java.lang.String" length="1">
            <column name="IS_READ" />
        </property>
    <property name="re"  type="java.lang.String" length="1000">
            <column name="REMARK" />
        </property>
    <property name="readDate"  type="java.util.Date">
            <column name="READ_DATE" />
        </property>
        
    </class>
</hibernate-mapping>使用的HQL语句为:
from TSendplat po where po.status='2' and po.TSendplatDetails.toOrg='188'  order by po.TSendplatDetails.isRead desc最后翻译的时候变成了:
select * from ( select tsendplat0_.ID as ID30_, tsendplat0_.S_NUMBER as S2_30_, tsendplat0_.FROM_ORG as FROM3_30_, tsendplat0_.SURRENDER_ORG as SURRENDER4_30_, tsendplat0_.SURRENDER_NAME as SURRENDER5_30_, tsendplat0_.SEND_DATE as SEND6_30_, tsendplat0_.FROM_ORG_NAME as FROM7_30_, tsendplat0_.TITLE as TITLE30_, tsendplat0_.STATUS as STATUS30_, tsendplat0_.SURRENDER_NUMBER as SURRENDER10_30_, tsendplat0_.SURRENDER_CONTENT as SURRENDER11_30_ from T_SEND_PLAT tsendplat0_, T_SEND_DETAIL tsendplatd1_, T_SEND_DETAIL tsendplatd2_ where tsendplat0_.ID=tsendplatd2_.S_ID and tsendplat0_.ID=tsendplatd1_.S_ID and tsendplat0_.STATUS='2' and tsendplatd1_.TO_ORG='188' order by tsendplatd2_.IS_READ desc ) where rownum <= ?
不什么为什么会有两个子类的关联啊?from T_SEND_PLAT tsendplat0_, T_SEND_DETAIL tsendplatd1_, T_SEND_DETAIL tsendplatd2_

解决方案 »

  1.   

    from TSendplat po where po.status='2' and po.TSendplatDetails.toOrg='188'  order by po.TSendplatDetails.isRead desc 
    hibernate解析的问题吧,先查询TSendplat ,然后在解析where里的条件的时候把TSendplatDetails解析成子查询了一般都是这么用from TSendplat po, IN(po.TSendplatDetails) poi where ......
    或者用join  fetch
      

  2.   

     <many-to-one name="TSendplat" class="TSendplat" fetch="select">
                <column name="S_ID" precision="9" scale="0" not-null="true" />
            </many-to-one>
    多对一关系``
      

  3.   

    谢谢楼上的
    现在还有个问题,我只想要集合里满足条件的.
    怎么样做到我访问这个集合的时候只有满足条件的子记录,会不会有点导想天开了呀?估计也不行
    能不能改一下呢?我应该如何去写这个SQL呢?就只要主要信息和符合条件的子表记录(where toOrg='188' )select po,po.TSendplat from xxx吗?有什么办法可以得到的结果少一些(集合里的记录);
    结果是Object[]也可以.
      

  4.   

    是不是这样,这个已经根据188过滤了
    select po, poi from TSendplat po, IN(po.TSendplatDetails) poi where where poi.toOrg='188'
    返回结果中存放一堆Object[] ,0是po 1是poi
      

  5.   

    唉,,,这个Order By是不是有问题啊..
    我再用一个order by op.TSendplatDetails.id
    它关联的时候又多出了一个了.郁闷啊
      

  6.   

    select po, poi from TSendplat po, IN(po.TSendplatDetails) poi where where poi.toOrg='188' 
    这样我试了一下,不行啊.是不是还要改造一下啊.