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

如何使用Spring Data JPA通过复合主键的单个字段查询数据

实现方案

1. 确认复合主键的实体配置

首先确保你的复合主键类(比如CompanyRelationshipId)已经正确实现Serializable接口,并用@Embeddable注解标记;实体类则通过@EmbeddedId关联这个主键类。示例代码如下:

// 复合主键类
@Embeddable
public class CompanyRelationshipId implements Serializable {
    private Long companyId; // 对应你的column1
    private Long relatedCompanyId; // 对应你的column2

    // 必须实现构造方法、getter/setter、equals和hashCode方法
}

// 实体类
@Entity
public class CompanyRelationship {
    @EmbeddedId
    private CompanyRelationshipId id;

    // 其他业务字段及对应方法
}

2. 实现Repository查询

创建继承自JpaRepository的Repository接口,通过两种方式实现需求:

方式一:Spring Data方法命名查询

直接遵循Spring Data的方法命名规则,框架会自动生成对应SQL:

public interface CompanyRelationshipRepository extends JpaRepository<CompanyRelationship, CompanyRelationshipId> {
    // 通过column1(对应主键类里的companyId)查询所有记录
    List<CompanyRelationship> findByIdCompanyId(Long companyId);

    // 通过column2(对应主键类里的relatedCompanyId)查询所有记录
    List<CompanyRelationship> findByIdRelatedCompanyId(Long relatedCompanyId);
}

注意:方法名里的Id对应实体类中@EmbeddedId标记的字段名,后面跟主键类里的属性名,命名必须严格匹配。

方式二:@Query注解自定义查询

如果需要更灵活的查询逻辑,可以用@Query注解编写JPQL或原生SQL:

public interface CompanyRelationshipRepository extends JpaRepository<CompanyRelationship, CompanyRelationshipId> {
    // JPQL写法:通过column1查询
    @Query("SELECT cr FROM CompanyRelationship cr WHERE cr.id.companyId = :companyId")
    List<CompanyRelationship> findByCompanyId(@Param("companyId") Long companyId);

    // 原生SQL写法:通过column2查询
    @Query(value = "SELECT * FROM company_relationship WHERE related_company_id = :relatedCompanyId", nativeQuery = true)
    List<CompanyRelationship> findByRelatedCompanyId(@Param("relatedCompanyId") Long relatedCompanyId);
}

3. 业务层调用

在业务类中注入Repository,直接调用对应方法即可:

@Service
public class CompanyRelationshipService {
    private final CompanyRelationshipRepository repository;

    // 构造方法注入
    public CompanyRelationshipService(CompanyRelationshipRepository repository) {
        this.repository = repository;
    }

    public List<CompanyRelationship> getByColumn1(Long companyId) {
        return repository.findByIdCompanyId(companyId);
        // 若用@Query方式则调用:repository.findByCompanyId(companyId);
    }

    public List<CompanyRelationship> getByColumn2(Long relatedCompanyId) {
        return repository.findByIdRelatedCompanyId(relatedCompanyId);
        // 若用@Query方式则调用:repository.findByRelatedCompanyId(relatedCompanyId);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 04:46:08