当前位置: 首页 > 知识库问答 >
问题:

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

扈德容
2023-03-14

我有现有的学生,临时演员

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;
}

附加实体类:

@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;
}

和地址实体类

@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();
}

但是当我在学生实体中使用OneToOne时,我得到了异常“org.hibernate.LazyInitializationException:未能懒惰地初始化角色集合:com.jpa.belajarjpa.enitities.Student.extras,无法初始化代理-没有会话”。但是当我在学生实体中使用OneToOne时,我没有遇到异常,但得到了错误的结果,学生(id=1,名称=john,附加项=null),当我执行此查询时,它显示正确的结果SELECT*From学生加入附加项ONstudent.id=extras.student_idJOIN地址ONaddress.addr_id=extras.extras_value

共有2个答案

羊舌炯
2023-03-14

通过在属性中添加spring . JPA . properties . hibernate . enable _ lazy _ load _ no _ trans = true解决

程吕恭
2023-03-14

您需要将联接提取与 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();
}

< code > spring . JPA . properties . hibernate . enable _ lazy _ load _ no _ trans = true 是一个反模式。如果我是你,我就不会用它。

 类似资料:
  • 我有以下三张桌子 教室 注册学生 iduser_idclass_id 帖子 模型 Classroom.php 注册学生。php 邮递php 现在我需要获得某个班级的所有帖子,学生在该班级注册。 例如,一名学生注册了教室表中id号为1的班级。所以在registered_students表中会注意到,这个特定的用户是在这个特定的类下注册的。每个类在post表中可能有多个post。用户需要获得他类的所有

  • 我有两个表,一个用于聚会,一个用于记分卡模板映射。记分卡模板映射表有一个返回到party(on id)的外键。我想找到一个有记分卡模板映射细节的所有各方的列表。

  • 我有一个实体叫做Test。java有70个字段,其中一些字段还与其他实体相关(通过连接一对多、多对一等关联)。 我需要有一个这种类型的对象,但我不需要所有的字段,只有3个字段,其中一个字段与其他实体有外键关系。 因此,我在执行查询的同时编写了一个本机查询。jpa执行其他查询也会导致花费太多时间来完成。 这是我的实体类: 这是我的原生查询 我怎样才能得到具有选定字段的订单实体对象,我不需要其他字段意

  • 然后我添加了一个自定义存储库来执行搜索: 然后我这样搜索: 但是我没有得到任何结果,尽管事实上有匹配的结果。 我在谷歌上没有找到任何答案。有人能帮我吗?

  • 当我按下搜索按钮时,出现以下错误: 发生错误: 异常[EclipseLink-4002](Eclipse持久性服务-2.3.2.v20111125-r10461):org。日食坚持不懈例外。DatabaseException内部异常:java。sql。SQLException:索引处缺少IN或OUT参数::1错误代码:17041调用:从CRM_DAILY_SHEET WHERE to_char(报

  • 我有两个表,用户和角色,它们是多对多的 我正在使用EntityManager进行查询。 我如何使JPA知道映射一个用户和多个角色?