背景信息:
我们的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子句,以将视图限制为特定用户和可能的日期范围。