首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用本机查询在JPA中执行嵌套连接

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

Stack Overflow用户
提问于 2020-11-11 10:44:53
回答 2查看 2.5K关注 0票数 1

我有现有的桌位学生、临时演员和这个结构的地址。

代码语言:javascript
复制
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
--------------------------------------------

如何在上连接这些表?我目前的代码是

学生实体班

代码语言:javascript
复制
@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;
}

额外实体类:

代码语言:javascript
复制
@Data
@Entity
@Table(name="extras")
public class Extras implements Serializable {
    @Id
    @Column(name="id")
    private int id;

    @Column(name="student_id", nullable = false)
    private int studentId;

    @Column(name="extras_key", nullable = false)
    private String extrasKey;

    @Column(name="extras_value", nullable = false)
    private String extrasValue;

    @OneToOne(optional = false)
    @NotFound(action = NotFoundAction.IGNORE)
    @JoinColumn(name = "extras_value", referencedColumnName = "addr_id", insertable = false, updatable = false)
    private Address address;
}

和地址实体类

代码语言:javascript
复制
@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;

}

这是我的存储库类

代码语言:javascript
复制
@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();
}

但是,当我在“学生”实体中使用OneToMany时,我发现异常OneToMany无法延迟初始化角色集合: com.jpa.belajarjpa.enitities.Student.extras,无法初始化代理-没有会话“”。但是当我在“学生”实体中使用OneToOne时,我没有遇到异常,而是得到了错误的结果,“学生”(id=1,name=john,extras=null),当我执行这个查询时,它会显示正确的结果 SELECT *来自address.addr_id = extras.extras_value上student.id=extras.student_id连接地址的student.id=extras.student_id连接附加地址。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-12 08:14:24

您需要在HQL查询中使用join获取,如下所示:

代码语言:javascript
复制
@Repository
public interface StudentRepository extends CrudRepository<Student, Integer> {
    @Query("FROM Student s " +
            "JOIN FETCH s.extras e " +
            "JOIN FETCH e.address")
    List<Student> findAllData();
}

spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true是一种反模式.如果我是你我就不会用了。

票数 1
EN

Stack Overflow用户

发布于 2020-11-12 04:31:34

通过在属性中添加spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true来解决

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64784914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档