JPA使用@EmbeddedId复合主键时如何编写按courseId查询的方法
解决方案
你可以通过以下两种正确方式定义查询方法:
方式1:使用属性层级分隔的派生查询方法
Spring Data JPA 中访问嵌套对象属性时,需要用下划线 _ 明确标注层级关系,避免字段解析歧义,直接在Repository中添加如下方法即可:
List<CourseRating> findById_CourseId(int courseId);
该方法名会被JPA正确解析为:查询主实体CourseRating的id属性(复合主键对象)下courseId等于传入参数的所有记录。
方式2:使用@Query自定义JPQL查询(更推荐,可读性更高)
如果不想受限于方法名的命名规则,或者后续需要扩展更多查询条件,可以直接自定义JPQL语句:
@Repository public interface CourseRatingRepository extends JpaRepository<CourseRating, CourseRatingKey> { @Query("SELECT cr FROM CourseRating cr WHERE cr.id.courseId = :courseId") List<CourseRating> findAllByCourseId(@Param("courseId") int courseId); }
如果使用Spring Data 2.4及以上版本,参数名和JPQL中占位符命名一致的情况下,可以省略@Param注解。
内容的提问来源于stack exchange,提问作者Monoxyd
相关产品推荐
相关产品推荐

