首页 > 解决方案 > 多对多注释未在选择查询中生成连接

问题描述

摘要:我正在尝试使用 jpa + hibernate 构建并急切地检索单向多对多关系。

执行 findAll() 时,引用的实体为空,而应为 1。

hibernate 正在生成的 SQL(使用 show-sql 属性)缺少我所看到的连接。

上下文

我尝试过的一些替代方案/修复:

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 的三个表中进行内部连接的查询。

任何帮助,将不胜感激。

标签: javamysqlhibernatejpa

解决方案


我检查了你的映射——它是正确的。我正在使用这些课程。

@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 不使用连接classclass_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


推荐阅读