Spring Data JDBC生成无效SQL查询问题求助
Spring Data JDBC 关联查询SQL不符合预期的问题分析与解决
问题原因
Spring Data JDBC 默认将包含其他实体的类视为聚合根,被包含的实体属于该聚合的一部分。按照这个规则,它会默认认为被包含实体的表(ticket_type)中存在指向聚合根表(ticket)的外键(默认列名是聚合根表名/类名小写,比如ticket或ticket_id),所以生成的关联条件是ticketType.ticket = ticket.id,这和你的实际表结构(ticket表通过ticket_type字段关联ticket_type表的id)完全相反。
你误用了@MappedCollection注解,这个注解是专门用于处理集合类型的一对多关联(比如TicketType中包含List<Ticket>),而非单个实体的多对一引用,所以添加后生成的关联条件变成ticketType.ticket_id = ticket.id,依然不符合你的需求。
正确解决方案
对于Ticket表通过ticket_type外键关联ticket_type表的多对一场景,需要在Ticket类的ticketType字段上使用@Reference注解,显式指定外键列是ticket表中的ticket_type字段:
@Table("ticket") public class Ticket { @Id private int id; private String subject; // 指定ticket表中的ticket_type列作为关联TicketType的外键 @Reference(foreignKey = @ForeignKey(name = "ticket_type")) private TicketType ticketType; // getters and setters } @Table("ticket_type") public class TicketType { @Id private int id; private String name; // getters and setters }
修改后,Spring Data JDBC生成的SQL会变成符合预期的关联条件:
SELECT `ticket`.`id` AS `id`, `ticket`.`subject` AS `subject`, `ticketType`.`id` AS `tickettype_id`, `ticketType`.`name` AS `tickettype_name` FROM `ticket` LEFT OUTER JOIN `ticket_type` `ticketType` ON `ticketType`.`id` = `ticket`.`ticket_type`
内容的提问来源于stack exchange,提问作者Thisara Dilshan
相关产品推荐
相关产品推荐

