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
相关产品推荐
相关产品推荐

