背景信息:

我们的Web应用程序(一种社交网络)使用户可以向系统添加图库和文档。画廊由Gallery类表示,并使用适当的休眠映射进行映射-文档也是如此。这两个类都包含一个creationDate字段。

问题

实施新闻系统(类似于Facebook的Home),我需要能够同时从两个类中检索前N个结果(按creationDate排序)。

使用休眠标准,我很清楚如何从每个类中获取前N个结果,但这不是我想要的。我可以这样做,然后对它们进行排序,但效率似乎并不高。

例:

具有:

Gallery 1 - 12/09/13 10:10
Gallery 2 - 12/09/13 09:10
Gallery 3 - 12/09/13 08:20
Gallery 4 - 12/09/13 08:10




Document 1 - 12/09/13 08:25
Document 2 - 12/09/13 07:10
Document 3 - 12/09/13 06:15
Document 4 - 12/09/13 05:10


要求前四个会给出:

Gallery 1 - 12/09/13 10:10
Gallery 2 - 12/09/13 09:10
Document 1 - 12/09/13 08:25
Gallery 3 - 12/09/13 08:20


您将如何实现这样的目标?

最佳答案

我用于这种情况的一种策略是创建一个将两个表合并的视图。

因此,可以说它们存储在数据库中,例如:

create table GALLERY(
    GALLERY_ID INT,
    NAME VARCHAR2(20),
    CREATION_DT
);

create table DOCUMENT(
    GALLERY_ID INT,
    NAME VARCHAR2(20),
    CREATION_DT
);


该视图类似于(伪代码):

CREATE OR REPLACE VIEW V_NEWS as
select
   GALLERY_ID as NEWS_ID
   NAME,
   CREATION_DT,
   'GALLERY' as TYPE
from GALLERY
UNION
select
   DOCUMENT_ID as NEWS_ID
   NAME,
   CREATION_DT,
   'DOCUMENT' as TYPE
from DOCUMENT


现在,在您的应用程序中使其成为一个类/实体,并与Hibernate进行适当的连接。在ORM中,视图就像表一样映射,唯一的区别是,除非您建立一些触发器(我不建议这样做),否则您无法将其插入视图。似乎该功能无论如何都将只读,因此这不是问题。显然,您不想合并完整的表集,并且可能需要添加where子句,以将视图限制为特定用户和可能的日期范围。

07-24 09:20