在使用三个或更多表时,需要使用HQL获取数据的概念

时间:2013-01-22 06:53:54

标签: sql hibernate hql

关于我想做什么的小型简报。

我有三个表Content(contentId,body,timeofcreation),ContentAttachmentMap(contentId,attachmentId)和Attachment(attachmentId,resourceLocation)。

我采用创建映射表的原因是因为在将来的应用程序中,附件也可以与不同的内容共享。

现在我正在使用HQL来获取数据。我的目标如下:

  1. 获取包含/不包含附件的所有内容
  2. 我在互联网上看到过一些例子,比如你可以创建一个特定于目标的类(不是POJO),并在其构造函数中放置select语句中的属性名称,并返回该Class对象的List。

    例如HQL将是SELECT new com.mydomain.myclass(cont.id, cont.body) .....等等。

    在我的情况下,我正在寻找以下SELECT new com.mydomain.contentClass(cont.id, cont.body, List<Attachment>)FROM ...`。是的,我想让resultList包含contentid,contentbody和其附件列表作为单个结果列表项。如果没有附件,那么它将返回(cont.id,contentbody,null)。

    这可能吗?还告诉我如何编写SQL语句。

    提前致谢。

1 个答案:

答案 0 :(得分:2)

我觉得你正在以一种根本错误的方式使用Hibernate。您应该使用Hibernate来查看您的域实体,而不是将其用作公开基础表。

您不需要为所有这些设置contentClass特殊值对象。只需选择内容实体即可满足您的需求。

我认为拥有实际的例子会更容易。

在您的应用程序中,您没有将其视为“3个表”,您应该将其视为2个实体,这看起来像是:

@Entity
public class Content {
  @Id
  Long id;

  @Column(...)
  String content;

  @ManyToMany
  @JoinTable(name="ContentAttachmentMap")
  List<Attachment> attachments;
}

@Entity
public class Attachment {
  @Id
  Long id;

  @Column(...)
  String resourceLocation
}

而且,您正在寻找的结果只是HQL的结果,如

from Content where attachments IS EMPTY

我相信你也可以加入fetch以节省数据库访问权限:

from Content c left join fetch c.attachments where c.attachments IS EMPTY