Spring Data JPA生成错误ON子句致SQL查询失败
问题分析与解决方案
错误原因
你的User和Log实体仅标注了@Table注解,缺少JPA实体必需的@Entity注解。Spring Data JPA 3.0虽支持用Record作为实体,但必须通过@Entity明确标识,否则框架无法正确解析实体间的关联关系,进而生成了错误的SQL关联条件。
解决方案
1. 为实体Record添加@Entity注解
修改User和Log类,添加@Entity注解,让JPA正确识别实体及关联映射:
修改后的User类
@Entity @Table("users") public record User( @Id UUID id_user, @Nullable String name, @Nullable String email, String upn, boolean active, @Embedded(onEmpty = USE_NULL) UserSpecialPermissions permissions ) { (... code omitted ...) }
修改后的Log类
@Entity @Table("logs") public record Log( @Id UUID id_log, @Column("datetime") OffsetDateTime dateTime, @Nullable @ManyToOne @JoinColumn(name = "actor", referencedColumnName = "id_user") User actor, UUID device, @Nullable UUID method, @Enumerated(EnumType.ORDINAL) Result result ) { (... code omitted ...) }
2. 确保嵌入类标注@Embeddable
由于User中使用了@Embedded关联UserSpecialPermissions,该类必须标注@Embeddable才能被JPA正确解析:
@Embeddable public record UserSpecialPermissions( boolean is_auditor, boolean is_enroller, boolean is_administrator ) {}
验证
添加注解后,Spring Data JPA会正确识别Log中的@ManyToOne关联,生成符合预期的SQL关联条件:ON "users"."id_user" = "logs"."actor",解决列不存在的报错。
内容的提问来源于stack exchange,提问作者Vilican
相关产品推荐
相关产品推荐

