从两个或更多组中检索前N个对象

时间:2013-09-12 09:23:06

标签: java sql hibernate

背景信息:

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

问题

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

使用hibernate Criteria 我知道如何从每个类中获得前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

要求第一个 4 会给出:

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

你会如何实现这样的目标?

1 个答案:

答案 0 :(得分:1)

我用于此类场景的一个策略是创建一个联合两个表的视图。

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

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

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

视图看起来像(Psuedo Code):

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进行适当的连接。在ORMs视图中,映射就像表一样,唯一的区别是你不能插入视图,除非你建立了一些触发器(我不推荐)。似乎无论如何这个功能都是只读的,所以这应该不是问题。显然,您不希望联合完整的表集,并且可能需要添加一个where子句,将视图限制为特定用户和可能的日期范围。