java - 使用 Hibernate 计算和存储预先计算的平均值

标签 java hibernate hibernate-annotations

假设我有一组产品,每个产品都有一组评论。每条评论都有一个分数。我将更频繁地需要分数的平均值,然后我将需要实际的评论。是否有任何最佳实践/干净的方法来预先计算平均值并将其存储在 hibernate 中。

我目前正在考虑向产品表添加评论计数和评论总和列,并操纵添加评论方法来更新计数和总和。

如果听到更简洁的方法,我会很高兴。

最佳答案

我建议不要在父表中保留总和列。如果两个相互竞争的请求试图更新 sum 列,一个将失败,或者您冒着用过时的读取破坏总和的风险(除非系统没有高流量......)。

您需要的查询非常简单,任何体面的数据库都应该在一段时间内提供良好的性能(惰性伪 SQL/HQL):

1) 产品的特定平均评分:

select sum(score)/count from reviews where product_id = ?

2) 产品列表及其平均评分

select product_name, sum(r.score)/count(r.score)
from products p
join reviews r
group by product_name

对于第一个查询,请确保您在评论表的 product_id 上有某种索引。

使用 hibernate ,您可以通过 HQL 或 Criteria objects 使用投影查询.如果这还不够快,那么我会调查 second level caching and query caching .

打开 show_sql 和 TestTestTest 以确保 hibernate 只访问数据库一次,并且当添加/更新新项目时您的缓存无效。

关于java - 使用 Hibernate 计算和存储预先计算的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5454098/

相关文章:

java - 使用 RestClusterClient 在 Flink 集群上运行已部署的作业

java - Spring JPA/Hibernate 存储库 findOne 方法返回 null

Java: hibernate @OneToOne 映射

java - 对组合键的一部分进行条件查询

java - Hibernate jar 兼容性问题

java - 如何在Java中的所有线程中维护List的单个副本

java - 了解泛型

java - hibernate 保存或更新与删除

java - 使用枚举和反射来调用类列表上的方法

java - 由 IllegalStateException : This web container has not yet been started 引起的 Hibernate InstantiationException