【问题标题】:Need a concept on fetching data with HQL while three or more tables are in use需要在使用三个或更多表时使用 HQL 获取数据的概念
【发布时间】:2013-01-30 09:56:36
【问题描述】:

简要介绍一下我正在尝试做的事情。

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

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

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

  1. 获取所有带/不带附件的内容

我在网上看到过一些例子,比如你可以创建一个特定于目标的类(不是 POJO),并将 select 语句中的属性名称放在其构造函数中,然后返回该类对象的列表。

例如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语句。

提前致谢。

【问题讨论】:

    标签: sql hibernate hql


    【解决方案1】:

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

    对于所有这些,您不需要拥有 contentClass 特殊值对象。只需选择 Content 实体即可满足您的需求。

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

    在您的应用程序中,您不会将其视为“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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-08
      • 2022-10-20
      • 2021-12-24
      • 1970-01-01
      • 2011-10-26
      • 2022-10-14
      • 1970-01-01
      • 2022-06-17
      相关资源
      最近更新 更多