Spring数据jdbc一对多错误join
Spring data jdbc one-to-many wrong join
我正在使用 spring-boot 2.3.3 和 spring-data-jdbc 2.0.3 来模拟 guitar 元素和 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 是这样的:
SELECT (...) FROM `guitars` LEFT OUTER JOIN `class_type` AS `classType` ON `classType`.`id` = `guitars`.`classType`
我是不是漏掉了什么?
这不是一对多关系。一个 Guitar
将引用多个 ClassType
个实例。
相反,它似乎是一种多对一的关系:许多 Guitar
个实例可能引用相同的 ClassType
。这使得 ClassType
与 Guitar
不同,因此它不能被直接引用 java 引用,而只能通过它的 id 引用。
有关如何使用 Spring 数据 JDBC 建立这种关系模型的更详细说明,请参阅 Spring Data JDBC, References, and Aggregates。
我正在使用 spring-boot 2.3.3 和 spring-data-jdbc 2.0.3 来模拟 guitar 元素和 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 是这样的:
SELECT (...) FROM `guitars` LEFT OUTER JOIN `class_type` AS `classType` ON `classType`.`id` = `guitars`.`classType`
我是不是漏掉了什么?
这不是一对多关系。一个 Guitar
将引用多个 ClassType
个实例。
相反,它似乎是一种多对一的关系:许多 Guitar
个实例可能引用相同的 ClassType
。这使得 ClassType
与 Guitar
不同,因此它不能被直接引用 java 引用,而只能通过它的 id 引用。
有关如何使用 Spring 数据 JDBC 建立这种关系模型的更详细说明,请参阅 Spring Data JDBC, References, and Aggregates。