HQL查询使用join从表中获取数据

时间:2014-02-20 09:46:59

标签: hibernate hql

我需要有关编写HQL查询以使用join从三个表中获取数据的帮助。

public class PostMessages  implements java.io.Serializable {
     private Long messageid;
     private String message;
      private Set videosDescriptions = new HashSet(0);
     private Set postImageses = new HashSet(0);
}

public class PostImages  implements java.io.Serializable {
     private Long imageId;
     private String smallPicPath;
     private String largePicPath;
     private PostMessages postMessages;
 }

public class VideosDescription  implements java.io.Serializable {
     private Long videoId;
     private String videoPath;
     private String videoTitle;
     private PostMessages postMessages;
    }

PostMessages.hbm.xml 中,我将这两个类映射为

<set name="postImageses" table="post_images" inverse="true" lazy="true" fetch="select">
     <key>
     <column name="messageid" />
     </key>
  <one-to-many class="hibernetMappings.PostImages" />
</set>
<set name="videosDescriptions" table="videos_description" inverse="true" lazy="true" fetch="select">
  <key>
   <column name="message_id" />
  </key>
  <one-to-many class="hibernetMappings.VideosDescription" />
 </set>

以上是我的pojo课程我想获取所有postMessages以及postImagesvideoDescription详细信息以获取给定的消息ID如何获取它。

2 个答案:

答案 0 :(得分:2)

OP的答案可能有效,但盲目加入〜ToMany关系的两个“路径”将导致生成的SQL是一个效率低下的查询,它为结果提供了笛卡尔积。

为了简化故事,假设我们有这样的实体:

public class Message {
    @Id
    private Long id;

    @OneToMany
    private Set<Image> images;

    @OneToMany
    private Set<Description> descriptions;
}

如果您正在通过

检索Message +的图像及其描述
from Message 
left join fetch images 
left join fetch descriptions 
where id = :id

如果该消息包含100个图像和100个描述,则生成的SQL将为您提供10,000条记录。

获取此方法的更恰当方法是发出两个查询。

from Message left join fetch images where id = :id

from Message left join fetch descriptions where id = :id

使用Hibernate的第一级缓存(或任何JPA实现),您可以获得其中一个查询的结果,并且您将同时获取图像或描述。

为了避免混淆,如果你有这样的结构:

[Foo]  1-->* [Bar]  1-->* [Qux]

没关系

from Foo foo join fetch foo.bars bar join fetch bar.quxs qux where foo.id = :id

答案 1 :(得分:0)

我尝试了以下正常运行的查询

select distinct pm
     from PostMessages as pm
     left join fetch pm.postImageses as pi
     left join fetch pm.videosDescriptions as vd 
     where pm.messageid=67

如果有任何其他方式来获取此查询,请提供