我需要有关编写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
以及postImages
和videoDescription
详细信息以获取给定的消息ID如何获取它。
答案 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
如果有任何其他方式来获取此查询,请提供