java - 多对多注释未在选择查询中生成连接
问题描述
摘要:我正在尝试使用 jpa + hibernate 构建并急切地检索单向多对多关系。
执行 findAll() 时,引用的实体为空,而应为 1。
hibernate 正在生成的 SQL(使用 show-sql 属性)缺少我所看到的连接。
上下文:
- Spring Data - 4.0.4.RELEASE
- 休眠 - 4.2.21.Final
我尝试过的一些替代方案/修复:
- 尝试将它们切换到 OneToMany/ManyToOne 关系。
- 尝试通过使用 mappedBy 从 Student 引用 Class 来建立双向多对多关系
- 已尝试将 Class 的 id 列更新为在连接表中没有不同
Java 实体
@Data
@Entity
@Table(name = "student")
public class Student {
@Column(name = "student_id", unique = true, nullable = false)
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Data
@Entity
@Table(name = "Class")
public class Class {
@Column(name = "id", unique = true, nullable = false)
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
name = "class_student",
joinColumns = @JoinColumn(name = "class_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "student_id", referencedColumnName = "student_id"))
private Set<Student> students;
DDL:
CREATE TABLE IF NOT EXISTS `student` (
student_id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`student_id `)
);
CREATE TABLE IF NOT EXISTS `class` (
`id` INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
);
CREATE TABLE IF NOT EXISTS `class_student ` (
student_id INT NOT NULL,
class_id INT NOT NULL,
PRIMARY KEY (`student_id `, `class_id`),
CONSTRAINT `fk_student_id` FOREIGN KEY (`student_id`) REFERENCES `student` (`student_id`),
CONSTRAINT `fk_class_id` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`)
);
实际与预期:当我classRespository.getAll()
似乎缺少我期望的 class + class_student 之间的连接时实际生成的 sql。
它还奇怪地包括了 student 和 class_student 之间的连接,这是我没想到的,因为它是单向定义的,除了可能被丢弃之外,我不知道该意外查询的结果如何处理。
实际生成的 SQL:
Hibernate:
select
classin0_.id as id1_29_,
from
class classin0_
INNER JOIN
post_tag pt
ON p.id = pt.post_id
INNER JOIN
tag t
ON pt.tag_id = t.id
WHERE p.id = 1
Hibernate:
select
class_student0_.class_id as id1_30_1_,
class_student0_.student_id as featured2_10_1_,
student1_.student_id as featured1_28_0_,
from
class_student class_student0_
inner join
student student1_
on class_student0_.student_id=student1_.student_id
where
class_student0_.id=?
我希望在 jpa 可以解析回 Set 的三个表中进行内部连接的查询。
任何帮助,将不胜感激。
解决方案
我检查了你的映射——它是正确的。我正在使用这些课程。
@Entity
@Table(name = "student")
public class Student {
@Column(name = "student_id", unique = true, nullable = false)
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "name")
private String name;
}
@Entity
@Table(name = "Class")
public class Class {
@Column(name = "id", unique = true, nullable = false)
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "className")
private String className;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
name = "class_student",
joinColumns = @JoinColumn(name = "class_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "student_id", referencedColumnName = "student_id"))
private Set<Student> students;
}
当我 classRespository.getAll() 时实际生成的 sql 似乎缺少我期望的 class + class_student 之间的连接。奇怪的是,它还包括我没想到的 student 和 class_student 之间的连接
Hibernate 不使用连接class
和class_student
关系。
Hibernate 通过第一个查询获取所有类
select
class0_.id as id1_0_,
class0_.className as classNam2_0_
from
Class class0_
inner join
之后,使用betweenclass_student
和获取一个现有班级的所有学生student
。
select
students0_.class_id as class_id1_1_0_,
students0_.student_id as student_2_1_0_,
student1_.student_id as student_1_2_1_,
student1_.name as name2_2_1_
from
class_student students0_
inner join
student student1_
on students0_.student_id=student1_.student_id
where
students0_.class_id=?
我无法检查您的 SQL,因为它不正确。例如,表中没有这样class_student0_.id=?
的字段class_student
。
推荐阅读
- sql - SQL:名为 IN 的列导致查询错误
- php - 调用未定义的函数 GuzzleHttp\Handler\curl_reset()
- java - 我们如何以编程方式添加公式选项卡以及使用 java rest api 客户端在 docusign 中添加规则?
- ios - IOS Flutter 运行 - 未连接设备
- java - 如何使用 Streams 而不是包含变量的循环?
- c++ - 同一矩阵中无向图的个数
- directory - 区分 PyCharm 上的 2 个同名目录
- hangout - 环聊是否支持邀请 API?
- c - C中的特殊#define选项
- c# - C#:带有 .net 核心框架的可重用库中的控制器