一尘不染

Hibernate使用条件选择顶部和底部n行

hibernate

假设我有两个表格,书籍和评论。评论具有一列,星号,其值可以介于1到5之间。一本书可以包含许多评论。

如何选择所有书籍,以便使用Criteria API返回每本书的前3名和后3条评论(而不是所有评论)?

如果Criteria API无法使用,我会提出其他建议,例如HQL,SQL等。


阅读 226

收藏
2020-06-20

共1个答案

一尘不染

回答我自己的问题…

我实际上对这有多么困难感到惊讶。涉及查询书籍的所有解决方案以及每本书具有其顶部和底部评论列表的结果都会导致在某些数据库上每本书籍进行N次查询,尤其是对于我的(MySql)要求3N。当然,也许有人可以找到解决这个问题的巧妙方法,但是我在玩代码,原始SQL,研究他人所做的事情,数据库限制等方面似乎总会回到这一点。

所以…我最终把问题转过来了。每当我查询书籍时(而不是频繁查询-FYI书籍/评论仅出于示例目的-
实际域不同),我都不会计算顶部和底部的评论,而是在提交新评论时计算顶部/底部的评论。这将提交“评论”从一个“查询”更改为三个查询,但是与查询“书籍”相比,提交评论很少。

为此,我在Book中添加了两个新属性topReviews和bottomReviews,并将它们映射为Review上的一对多列表。然后,我更新了保存新评论的代码,以查询相关书籍的顶部和底部评论(2个查询),在书籍上设置顶部/底部评论属性(覆盖先前的评论),并保存该书籍。现在,任何“图书”查询都会返回这些“缓存的”顶部和底部评论。我仍然有一个懒惰的“
reviews”属性,如果需要的话,它将具有所有评论(而不仅仅是顶部/底部)-另一个一对多映射。

我愿意接受其他建议。此处的大多数答案都无济于事,但由于数据库限制或需要太多查询,因此会遗漏问题或无法解决。

2020-06-20