Hibernate中含复合键的表查询失败问题排查
问题:Spring Data JPA复合键关联查询方法报错
我有一张包含userId和listingId的表,二者共同构成复合键,相关代码定义如下:
复合键类
@Data @Embeddable public class FavoriteListingId implements Serializable { @Column(name = "user_id", columnDefinition = "CHAR(36)") private String userId; @Column(name = "listing_id", columnDefinition = "CHAR(11)") private String listingId; }
实体类
@Getter @Setter @Entity @Table(name = "favorite_listing") public class FavoriteListingEntity { @EmbeddedId FavoriteListingId id; }
仓库接口
@Repository public interface FavoriteListingRepository extends JpaRepository<FavoriteListingEntity, FavoriteListingId> { int countByListingId(String listingId); List<FavoriteListingEntity> findAllByUserId(String userId); }
运行时findAllByUserId方法报错:
No property userId found for type FavoriteListingEntity!
问题原因
FavoriteListingEntity本身没有直接的userId或listingId属性,这两个字段是嵌套在EmbeddedId类型的id属性中的。Spring Data JPA的方法命名查询无法直接识别嵌套属性,必须通过完整的属性路径来访问嵌套字段。
修正方案
修改仓库接口中的方法名,通过id.前缀指定复合键内的属性:
@Repository public interface FavoriteListingRepository extends JpaRepository<FavoriteListingEntity, FavoriteListingId> { // 修正count方法 int countByIdListingId(String listingId); // 修正查询方法 List<FavoriteListingEntity> findAllByIdUserId(String userId); }
备选方案
也可以使用@Query注解手写JPQL语句实现查询,可读性更强:
@Repository public interface FavoriteListingRepository extends JpaRepository<FavoriteListingEntity, FavoriteListingId> { @Query("SELECT f FROM FavoriteListingEntity f WHERE f.id.listingId = ?1") int countByListingId(String listingId); @Query("SELECT f FROM FavoriteListingEntity f WHERE f.id.userId = ?1") List<FavoriteListingEntity> findAllByUserId(String userId); }
内容的提问来源于stack exchange,提问作者ilhan
相关产品推荐
相关产品推荐

