如何使用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
相关产品推荐
相关产品推荐

