spring data JDBC 生成无效查询

问题描述 投票:0回答:2

这是我的表结构。我正在使用

spring-boot-starter-data-jdbc
3.0.3。我将这些表映射如下。

@Table("ticket")
public class Ticket {

    @Id
    private int id;
    private String subject;
    private TicketType ticketType;

// getters and setters
}

@Table("ticket_type")
public class TicketType {

    @Id
    private int id;
    private String name;

// getters and setters

}

当我尝试检索票证时,spring 抛出 BadSqlGrammarException。生成的查询是

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`.`ticket` = `ticket`.`id`

为什么 spring data JDBC 生成 on cause as

`ticketType`.`ticket` = `ticket`.`id` 

代替

`ticketType`.`id` = `ticket`.`ticket_type`

我尝试将 @MappedCollection(idColumn = "ticket_id") 添加到 Ticket 类中的 ticketType 字段。那么生成查询的原因是

ticketType
.
ticket_id
=
ticket
.
id
。我做错了什么?

one-to-many spring-data-jdbc
2个回答
0
投票

您可以尝试使用 ManyToOne 和 joinColumn 注释来映射实体,同时仍然保留 FK 列字段。

    @Table("ticket")
public class Ticket {

    @Id
    private int id;
    private String subject;
    @Column(name = "ticket_type")
    private int ticketType;
    
    @ManyToOne
    @JoinColumn(name = "ticket_type", referencedColumnName = "id", insertable = false, updatable = false)
    private TicketType ticketType;

// getters and setters
}

0
投票

Spring Data JDBC 期望一对一关系的外键与一对多关系的方向相同。

虽然一开始这看起来很奇怪,但我确实认为它很有意义。 它与一对多的情况是对称的。 聚合根 (

Ticket
) 不应该依赖于引用的实体 (
TicketType
),因此它也不应该在表中有引用,然后必须可以为空。 使用从引用实体指向聚合根的外键,它可以是
not null
.

另见允许在正常方向上进行 FK [DATAJDBC-128]

就是说,从实体名称来看,您似乎不想创建一对一的关系,而是一对多的关系。 这些被建模为一个简单的 id 值,可以选择包装在 Spring Data JDBC 中的

AggregateReference
中。 有关详细信息,请参阅Spring Data JDBC、参考和聚合

© www.soinside.com 2019 - 2024. All rights reserved.