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

Spring Data JPA中如何通过外键使用findBy()方法查询实体

基于外键查询EncodingResult的具体实现

1. 先明确实体关联关系

假设你的EncodingResult实体与Video是多对一关联,实体类定义大致如下:

@Entity
public class EncodingResult {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    // 与Video的关联,外键字段为video_id
    @ManyToOne
    @JoinColumn(name = "video_id")
    private Video video;

    // 另外两个关联实体的字段示例
    // @ManyToOne
    // @JoinColumn(name = "transcoder_id")
    // private Transcoder transcoder;
}

2. 定义Repository查询方法

直接在EncodingResultRepository接口中添加对应的查询方法,Spring Data JPA会自动生成实现逻辑:

(1)判断是否存在对应Video的EncodingResult

如果仅需判断存在性,定义如下方法:

public interface EncodingResultRepository extends JpaRepository<EncodingResult, Long> {
    // 根据Video的外键ID判断是否存在关联的EncodingResult
    boolean existsByVideoId(Long videoId);
}

在Controller中调用该方法处理GET请求:

@GetMapping("/encoding-results/exists")
public ResponseEntity<Boolean> checkExistsByVideoId(@RequestParam("videoId") Long videoId) {
    boolean exists = encodingResultRepository.existsByVideoId(videoId);
    return ResponseEntity.ok(exists);
}

(2)查询所有关联该Video的EncodingResult

如果需要获取具体的实体列表,添加:

List<EncodingResult> findByVideoId(Long videoId);

3. 关于EntityGraph的说明

你之前接触的EntityGraph,核心作用是解决N+1查询问题——当查询EncodingResult时需要同时加载它关联的Video或其他实体数据,避免多次访问数据库。但如果只是基于外键做查询/存在性判断,完全不需要用到它,因为此时仅操作外键字段,无需加载关联实体的内容。

举个需要用到EntityGraph的场景:如果查询EncodingResult时要同时返回关联的Video信息,可通过EntityGraph指定预加载关联:

@EntityGraph(attributePaths = {"video"})
List<EncodingResult> findByVideoId(Long videoId);

这样查询时会一次性加载EncodingResult和对应的Video数据,避免后续调用encodingResult.getVideo()时触发额外的数据库查询。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 00:15:29