当前位置: 首页 > 知识库问答 >
问题:

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

郝池暝
2023-12-22

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;    }}

共有2个答案

鲁博赡
2023-12-22

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

魏宏邈
2023-12-22

在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注解中,我们不需要显式地指定参数的占位符。

 类似资料:
  • 问题内容: 我有以下课程: 当我初始化Spring Data JPA时,出现错误: 问题: Spring Data JPA是否不支持对主键的子集进行查询? 还是我需要为此实现自定义存储库方法? 问题答案: 好的,我还尝试使用以下方法执行此操作: 这确实给了我一个不同的错误消息a ,这向我暗示Spring Data JPA无法为构建查询。我改为对该查询方法进行了自定义实现: …而且, 它起作用了!

  • 表的复合键是symbol和“datetime”(它只是一个时间戳)。这两列在dynamodb中都设置为字符串。 我收到的错误是:提供的键元素与模式不匹配

  • 问题内容: 我正在设计一个数据库,该数据库将用于存储来自许多不同来源的数据。我存储的实例由原始来源分配了唯一的ID。我存储的每个实例都应包含有关其来源的信息,以及与此来源相关联的ID。 作为示例,请考虑说明该问题的下表: 请注意,尽管每个来源的唯一,但有可能在不同来源中找到相同的来源。 我对关系数据库有一个不错的了解,但是与专家甚至是经验丰富的用户都相去甚远。我在此设计中面临的问题是应该用作主键。

  • 问题内容: 我在这里搜索,但未找到任何类似的主题,因此我发布了一个新问题。 我正在使用现有数据库上的Hibernate。我们不允许更改表的结构和数据。该应用程序正在从数据库读取数据,并根据某种逻辑迁移到另一个数据存储。 现在的问题是关于复合PK映射。例如 表A具有复合PK。 表B也有一个复合PK,此复合PK的一部分是A的PK,此处也用作FK。 我尝试了几种方法,但都无济于事。谁能告诉一个有效的Hi

  • 问题内容: 尝试查看是否有任何JavaScript库功能可以合并两个json对象的特定键的值 使用$ .extend和$ .merge给出以下结果 我正在寻找的是 问题答案: 您想深入扩展

  • 我有以下表格,如何将它们映射到JPA实体: 事件表与会议表具有一对多的关系。我如何在JPA中映射这种双向关系?