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

如何在JPA中实现自关联多对多映射的查询?

解决JPA自关联多对多查询好友用户名的问题

首先你需要修正User实体的多对多映射注解,当前使用的@JoinColumn不适用于多对多关联,应该用@JoinTable明确中间表的关联规则,否则Hibernate生成的中间表结构可能不符合预期:

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String username;
    
    @ManyToMany
    @JoinTable(
        name = "user_friends", // 指定中间表名,与你提到的一致
        joinColumns = @JoinColumn(name = "user_id"), // 当前用户在中间表的外键列
        inverseJoinColumns = @JoinColumn(name = "friends_id") // 好友在中间表的外键列
    )
    private List<User> friends;
    
    // 省略getter、setter及构造方法
}

下面提供几种实现查询的方案,按需选择:

方案1:JPQL查询(推荐)

在UserRepository接口中定义方法,通过@Query编写JPQL语句,直接返回好友用户名列表:

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import java.util.List;

public interface UserRepository extends CrudRepository<User, Long> {

    @Query("SELECT f.username FROM User u JOIN u.friends f WHERE u.id = :userId")
    List<String> findFriendUsernamesByUserId(Long userId);
}

方案2:原生SQL查询

直接复用你提供的原生SQL,通过nativeQuery=true启用原生SQL支持:

public interface UserRepository extends CrudRepository<User, Long> {

    @Query(value = "select user.username from user where user.id in(" +
                   "select user_friends.friends_id from user_friends where user_friends.user_id = :userId)",
           nativeQuery = true)
    List<String> findFriendUsernamesByUserId(Long userId);
}

方案3:Spring Data JPA方法命名+投影

如果不想写查询语句,可以结合方法命名规则和接口投影实现:

  1. 定义投影接口:
interface FriendUsernameProjection {
    String getUsername();
}
  1. 在Repository中定义方法:
public interface UserRepository extends CrudRepository<User, Long> {
    List<FriendUsernameProjection> findFriendsById(Long userId);
}

调用后通过projection.getUsername()获取用户名即可。

使用示例

注入UserRepository后直接调用方法:

@Autowired
private UserRepository userRepository;

// 查询ID为1的用户的所有好友用户名
List<String> friendUsernames = userRepository.findFriendUsernamesByUserId(1L);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 13:32:16