Java 如何使用本机查询在JPA中执行嵌套联接

Java 如何使用本机查询在JPA中执行嵌套联接,java,spring-boot,hibernate,jpa,Java,Spring Boot,Hibernate,Jpa,我有此结构的现有表student、extras和address Table student ------------------------------------------ id | name ------------------------------------------ 1 | John ------------------------------------------ Table extras -----------------------

我有此结构的现有表student、extras和address

Table student
------------------------------------------
id  |   name    
------------------------------------------
1   | John          
------------------------------------------

Table extras
-----------------------------------------------------------------
id  |   student_id  |  extras_key               | extras_value
-----------------------------------------------------------------
1   | 1             | class                     | X3
2   | 1             | address_id                | addr-2
-----------------------------------------------------------------

Table address
--------------------------------------------
addr_id     |   name            | city
--------------------------------------------
addr-2      | Office            | San Jose
--------------------------------------------
如何在JPA Hibernate上连接这些表?我现在的代码是

学生实体类

@Entity
@Table(name = "student")
@Data
public class Student implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    private Integer id;

    @Column(name = "name", nullable = false, columnDefinition = "TEXT")
    private String name;

//    @OneToOne
//    @JoinColumn(name = "id", referencedColumnName = "student_id")
//    private Extras extras;

    @OneToMany(mappedBy = "studentId")
    private Set<Extras> extras;
}
@Entity
@Table(name="address")
@Data
public class Address implements Serializable {
    @Id
    @Column(name="addr_id")
    private String addrId;

    @Column(name="name")
    private String name;

    @Column(name="city")
    private String city;

}
和地址实体类

@Entity
@Table(name = "student")
@Data
public class Student implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    private Integer id;

    @Column(name = "name", nullable = false, columnDefinition = "TEXT")
    private String name;

//    @OneToOne
//    @JoinColumn(name = "id", referencedColumnName = "student_id")
//    private Extras extras;

    @OneToMany(mappedBy = "studentId")
    private Set<Extras> extras;
}
@Entity
@Table(name="address")
@Data
public class Address implements Serializable {
    @Id
    @Column(name="addr_id")
    private String addrId;

    @Column(name="name")
    private String name;

    @Column(name="city")
    private String city;

}
这是我的存储库类

@Repository
public interface StudentRepository extends CrudRepository<Student, Integer> {
    @Query(value = "select * from student " +
            "JOIN extras ON student.id=extras.student_id " +
            "JOIN address ON address.addr_id = extras.extras_value", nativeQuery = true)
    List<Student> findAllData();
}
@存储库
公共界面StudentRepository扩展了crudepository{
@查询(value=“选择*来自学生”+
“在student.id=extras.student\u id上加入附加服务”+
“addr\u id=extras.extras\u值上的联接地址”,nativeQuery=true)
列出findAllData();
}
但是当我在学生实体中使用OneToMany时,我得到了异常“org.hibernate.LazyInitializationException:未能延迟初始化角色集合:com.jpa.belajarjpa.enities.Student.extras,无法初始化代理-无会话”。但当我在学生实体中使用OneToOne时,我不会遇到异常,但得到了错误的结果,Student(id=1,name=john,extras=null),当我执行这个查询时,它会显示正确的结果
从student.id=extras.student\u id加入address.addr\u id=extras.extras\u value中选择*由add spring.jpa.properties.hibernate解决。在属性中启用\u lazy\u load\u no\u trans=true

您需要在HQL查询中使用连接抓取:

@Repository
public interface StudentRepository extends CrudRepository<Student, Integer> {
    @Query("FROM Student s " +
            "JOIN FETCH s.extras e " +
            "JOIN FETCH e.address")
    List<Student> findAllData();
}
@存储库
公共界面StudentRepository扩展了crudepository{
@查询(“来自学生”+
“加入获取s.extras e”+
“加入获取电子邮件地址”)
列出findAllData();
}

spring.jpa.properties.hibernate.enable\u lazy\u load\u no\u trans=true
是一种反模式。如果我是你,我就不会使用它。

Extras是OneToOne,但在DB中有两个条目。这是正确的吗?是的,实际上是OneToMany,但当我尝试使用@OneToMany并设置为结果类型时,它抛出了错误。这是我在@OneToMany(mappedBy=“student”,fetch=FetchType.LAZY)设置额外功能之前的代码;我已经编辑了使用OneToMany关系的代码,但是仍然发生了一些错误谢谢!我编辑为@Query(“从学生的加入获取s.extras e加入获取e.address”);