问题是这样,一个终端对应着最后一次发送的信息,建了两个表 t_terminal  t_gps_one ,如果这个终端没有发送过任何信息,那这个t_gps_one表应该是没有任何与它数据的
简单来讲就是实现hibernate的一对一双向关联,并且t_gps_one一边是可能为空的,最重要的一点是读取t_terminal表数据时要连同对应的t_gps_one数据一起取出来
我是这样设置的 t_terminal的hbm.xml
<one-to-one name="gpsOneVO" class="com.gxcs.model.GpsOneVO" constrained="false"  cascade="delete" fetch="join"/>  t_gps_one的hbm.xml
<many-to-one name="terminalVO" class="com.gxcs.model.TerminalVO" fetch="join" unique="true" not-found="ignore" cascade="none">
            <column name="terminalId" not-null="true">
                <comment>终端的ID,外键</comment>
            </column>
        </many-to-one>
读取的时候都是先select t_terminal然后再select t_gps_one, 能不能做到是直接像SQL一样left join一条语句来查询数据啊
查了很多hibernate的相关资料,都是说把constrained设置为true就自动是join形式,但问题是t_gps_one不一定有数据啊,就非inner join不可,不能left join吗

解决方案 »

  1.   

    from  A   as   a   left   join   fetch   B   as   b;配置好了,不要立即加载
      

  2.   

    List list = session.createCriteria(SshMain.class).setFetchMode("subs", FetchMode.JOIN).list();
      

  3.   

    你看输出是两条语句么? 我没注意过这个事情 因为我从来不通过一对一查询一个实体里对应另外一个实体的属性 明天去公司看一下(我觉得应该是一条)如果不行那你就直接通过SQL查询吧也可以的
      

  4.   

    根据楼主提供的信息, 首先要改一下映射文件:t_terminal的hbm.xml
    <one-to-one name="gpsOneVO" class="com.gxcs.model.GpsOneVO" cascade="delete" property-ref="terminalVO"/>  t_gps_one的hbm.xml
    <many-to-one name="terminalVO" class="com.gxcs.model.TerminalVO" unique="true" not-found="ignore" cascade="none">
                <column name="terminalId" not-null="true">
                    <comment>终端的ID,外键</comment>
                </column>
            </many-to-one>
    其次代码可以这样写: session.createQuery("from TerminalVO t left join fetch t.gpsOneVO where ...");
      

  5.   

    那么说通过配置关系是行不通,还是得自己写SQL语句去实现了
      

  6.   

    看来还是很麻烦,只有一两个数据库操作方法还好,但是问题方法多呢,每次都要去join
      

  7.   


    确实是少了property-ref="terminalVO" 没有这个是取不到gps_one的数据的,谢谢