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

