【问题标题】:Spring data jdbc one-to-many wrong joinSpring数据jdbc一对多错误连接
【发布时间】:2020-12-13 12:02:12
【问题描述】:

我正在使用 spring-boot 2.3.3 和 spring-data-jdbc 2.0.3 来模拟元素吉他和 classType 之间的关系。吉他有一个 classType。

我在 H2 中的架构(也在 MySQL 中)是这样的:

CREATE TABLE class_type (
    id bigint NOT NULL AUTO_INCREMENT,
    description varchar(50) NOT NULL
    PRIMARY KEY (id)
);
CREATE TABLE guitars (
    id bigint NOT NULL AUTO_INCREMENT,
    name varchar(255) NOT NULL,
    description varchar(1000) NOT NULL,
    classType bigint NOT NULL,
    PRIMARY KEY (id),
    UNIQUE (name),
    FOREIGN KEY (classType) references class_type(id)
);

我有这些课程:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Table(value = "guitars")
public class Guitar {
    @Id
    long id;
    String name;
    String description;
    @MappedCollection(idColumn = "id")
    @Column(value = "classType")
    ClassType classType;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Table(value = "class_type")
public class ClassType {
    @Id
    Long id;
    String description;    
}

我的仓库是这样的:

@Repository
public interface GuitarRepository extends CrudRepository<Guitar, Long>, PagingAndSortingRepository<Guitar, Long> {}

当我调用这个测试时:

@SpringBootTest
public class GuitarOneManyTest {

    @Autowired
    GuitarRepository guitarRepository;

    @Test
    void findAllByName() {
        System.out.println(guitarRepository.findAll());
    }
}

这句话出现了一个不正确的 LEFT OUTER JOIN

SELECT `guitars`.`id` AS `id`, `guitars`.`name` AS `name`, `guitars`.`description` AS `description`, `classType`.`id` AS `classType_id`, `classType`.`description` AS `classType_description` FROM `guitars` LEFT OUTER JOIN `class_type` AS `classType` ON `classType`.`id` = `guitars`.`id`

但我希望选择是这样的:

SELECT (...) FROM `guitars` LEFT OUTER JOIN `class_type` AS `classType` ON `classType`.`id` = `guitars`.`classType`

我错过了什么吗?

【问题讨论】:

    标签: java mysql spring spring-boot spring-data-jdbc


    【解决方案1】:

    这不是一对多的关系。一个Guitar 将引用多个ClassType 实例。

    相反,它似乎是一种多对一关系:许多Guitar 实例可能引用相同的ClassType。这使得 ClassTypeGuitar 的聚合不同,因此它不能被直接 java 引用引用,而只能被它的 id 引用。

    有关如何使用 Spring Data JDBC 建模这种关系的更详细说明,请参阅 Spring Data JDBC, References, and Aggregates

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      相关资源
      最近更新 更多