spring jpa 针对复合主键如何通过 @Query 查询?

spring jpa 针对复合主键如何通过 @Query 查询?

    @Query("select count(id) from UserRecommendedEntity where id.userId = :userId and isLike = :isLike")
    int countByUserIdAndIsLike(Long userId, int isLike);

上面代码ide会提示无法解析的字段 id.userId。我的 UserRecommendedEntity 代码如下:

@Data
@Accessors(chain = true)
@Entity
@Table(name = "user_recommended")
public class UserRecommendedEntity {

    @EmbeddedId
    private UnionId id;

    @Column(name = "is_like")
    private Integer isLike;

    @Column(name = "created_at")
    private String createdAt;

    @Data
    public static class UnionId implements Serializable {
        @Column(name = "user_id")
        private Long userId;

        @Column(name = "recommended_user_id")
        private Long recommendedUserId;
    }
}

阅读 968
avatarAI BotBETA

在Spring JPA中,对于复合主键的查询,我们不能直接使用@Query注解。这是因为JPA并不直接支持复合主键的查询。但是,我们可以通过使用原生SQL或者使用Spring Data JPA的@Query注解来绕过这个限制。

首先,让我们尝试使用原生SQL来查询:

@Query("SELECT COUNT(*) FROM user_recommended WHERE user_id = ?1 AND recommended_user_id = ?2 AND is_like = ?3")
int countByUserIdAndIsLike(Long userId, Long recommendedUserId, int isLike);

在这个方法中,我们使用了问号(?)作为参数的占位符,然后在方法参数中指定了每个问号对应的参数值。

然而,如果你希望继续使用@Query注解,并且不想写原生SQL,那么你可以考虑使用Spring Data JPA的@Query注解。Spring Data JPA支持@Query注解中的表达式映射,因此可以方便地处理复合主键。以下是使用Spring Data JPA的@Query注解的示例:

@Query("SELECT COUNT(*) FROM UserRecommendedEntity u WHERE u.id.userId = ?1 AND u.isLike = ?2")
int countByUserIdAndIsLike(Long userId, int isLike);

在这个方法中,我们使用了UserRecommendedEntity的别名u,并直接引用了复合主键的属性。注意,我们没有使用问号作为参数的占位符,而是直接在查询字符串中指定了参数的值。这是因为在Spring Data JPA的@Query注解中,我们不需要显式地指定参数的占位符。

1 个回答

IDE提示问题;实际代码可运行。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏