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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 18:42:38