首页 > 解决方案 > Spring Boot @Formula 在每个结果上显示相同的 likeCount

问题描述

我的@Formula 字段有问题。我有三个表:user_acc、song 和 user_likes_song。我正在尝试根据歌曲 ID 在多对多表中出现的次数来显示歌曲的 likeCount。

我在 Song 实体中的 @Formula 字段如下所示:

@Formula("(SELECT COUNT(s.id) FROM user_acc u INNER JOIN user_likes_song us on u.id = us.user_id " +
            "INNER JOIN song s on us.song_id = s.id WHERE us.song_id = s.id )")
    private Long likeCount;

目前,当我第一次喜欢一首歌时,它会在每个结果上显示“likeCount:1”。在我喜欢另一首歌后,它会在每个结果中返回“likeCount: 2”,依此类推。

在我看来,它似乎是在计算所有喜欢的总数,而不是针对特定歌曲。我怎样才能让它显示特定歌曲 ID 在多对多表中出现的次数?

标签: springspring-boot

解决方案


您对每首歌曲行进行匹配:

INNER JOIN song s on us.song_id = s.id WHERE us.song_id = s.id 

您想要的是将其限制为当前歌曲实体实例。
事实上,如果@Formula注解是在Song实体的某个字段上指定的,你并不想Song在查询中指定,而是想直接引用当前实体的字段(这里id),即:

WHERE us.song_id = id 

所以这应该做的工作:

@Formula("(SELECT COUNT(*) FROM user_acc u INNER JOIN user_likes_song us on u.id = us.user_id " + "WHERE us.song_id = id )")  

而且我认为您还可以通过这种方式进行更多简化:

@Formula(" (SELECT COUNT(*) FROM user_likes_song us WHERE us.song_id = id) ")

因为与用户帐户的加入无关紧要。


推荐阅读