我使用springboot2.3.3和springdatajdbc2.0.3来建模to元素和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());
}
}
这个句子的左外连接不正确
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`
我错过什么了吗?
1条答案
按热度按时间laximzn51#
这不是一对多的关系。1
Guitar
将引用多个ClassType
示例。相反,这似乎是一种多对一的关系:多对多
Guitar
示例可能引用相同的ClassType
. 这使得ClassType
不同于Guitar
因此,它不能被直接的java引用引用,而只能被它的id引用。请参阅springdatajdbc,references,and aggregates,以获得如何用springdatajdbc建模这种关系的更详细的解释。