从数据库中读取时,我想根据两个因素对我的 Post
实体进行排序:
- 点赞数(越多越好)
- 年龄(越新越好)
目前我是这样实现的(作为计算值):
@Entity
public class Post {
// divide timestamp by a day length so after each day score decrements by 1
@Formula("UNIX_TIMESTAMP(creation_date_time) / 24 * 60 * 60 * 1000 + likes_count")
private long score;
@CreationTimestamp
private LocalDateTime creationDateTime;
@Min(0)
private long likesCount;
}
它工作正常但可能不是最好的方法,因为:
- 我认为 RDBMS 无法为
score
属性创建任何索引。 - 硬编码函数
UNIX_TIMESTAMP()
特定于MySQL。因此,如果我想在我的测试环境中使用另一个数据库(比如 H2),这将导致问题。
最佳答案
使用数据库触发器来更新/维护这些副聚合表。为这些事情运行繁重的计划作业(这会导致负载峰值)真的没有意义......
此外,WHERE 子句下面永远不会使用索引。从来没有。
UNIX_TIMESTAMP(creation_date_time) / 24 * 60 * 60 * 1000 + likes_count
关于java - 根据点赞数和创建时间对实体进行评分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52394246/