You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Twitter克隆项目中JPA多对多关联及粉丝查询SQL问题咨询

解决Twitter克隆中查询粉丝的问题

嘿,看你在搭建Twitter克隆的多对多关注关系,已经用JPA的@ManyToMany配置了following中间表,现在想查询某个用户的粉丝对吧?我来帮你梳理下解决方案。

首先先确认下你的表关系:following表的user_id是被关注者的ID,follower_id是发起关注的人(也就是粉丝)的ID。所以要查某个用户的粉丝,就是找所有在following表中user_id等于该用户ID的follower_id对应的用户。

1. 补全你的SQL查询

你之前写的SQL没完成,正确的写法有两种:

方式一:使用JOIN(性能更优)

SELECT u.*
FROM users u
INNER JOIN following f ON u.id = f.follower_id
WHERE f.user_id = ? -- 这里替换成你要查询的用户ID

方式二:使用子查询

SELECT * FROM users
WHERE id IN (SELECT follower_id FROM following WHERE user_id = ?)

2. 用JPA更优雅地实现(推荐)

既然已经用了JPA,其实可以通过实体关联来简化查询,不用手写复杂SQL。

首先,你当前的实体中只有following字段(表示当前用户关注的人),需要添加一个反向关联来映射粉丝关系:

@Entity
data class User(
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    val id: Long = 0,
    // 其他字段(比如用户名、头像等)...

    // 当前用户关注的人
    @ManyToMany(fetch = FetchType.EAGER, cascade = [CascadeType.PERSIST])
    @JoinTable(
        name = "following",
        joinColumns = [JoinColumn(name = "user_id", referencedColumnName = "id")],
        inverseJoinColumns = [JoinColumn(name = "follower_id", referencedColumnName = "id")]
    )
    var following: List<User> = emptyList(),

    // 关注当前用户的人(粉丝),mappedBy指向关联的维护端
    @ManyToMany(mappedBy = "following")
    var followers: List<User> = emptyList()
)

然后在你的UserRepository中添加查询方法,甚至不用写SQL,Spring Data JPA会自动生成:

@Repository
interface UserRepository : JpaRepository<User, Long> {
    // 根据用户ID查询粉丝(Spring Data JPA自动解析方法名生成SQL)
    fun findByFollowing_Id(userId: Long): List<User>

    // 或者用@Query自定义,逻辑更清晰
    @Query("SELECT follower FROM User user JOIN user.followers follower WHERE user.id = :userId")
    fun findFollowersByUserId(@Param("userId") userId: Long): List<User>
}

这样你在业务代码中直接调用userRepository.findFollowersByUserId(currentUserId)就能拿到粉丝列表了,比手写SQL更简洁也更符合JPA的使用习惯。

内容的提问来源于stack exchange,提问作者yooouuri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:09:25