我们的网络应用程序(一种社交网络)允许用户将图库和文档添加到系统中。画廊由 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
你会如何实现这样的目标?
答案 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子句,将视图限制为特定用户和可能的日期范围。