首页 > 解决方案 > 生成的 SQL 中超出范围的不相关实体的 Hibernate JOIN

问题描述

Hibernate 5.1开始,它开始为我们提供加入两个不相关实体的功能,就像我们在原生 SQL 中所做的那样。这是一个很棒的功能!但是,我最近遇到了此功能的意外行为。我有一个包含相关实体和不相关实体的混合JOIN(左连接和内连接)的查询。在生成的 SQL 中,所有不相关的实体 JOIN 都放在查询的底部,这导致了这个异常: com.microsoft.sqlserver.jdbc.SQLServerException: The multi-part identifier "tlterm6_.term_id" could not be bound.

我对这是如何发生的以及为什么以这种方式实现该功能感到困惑(他们必须有一个很好的解释,但我还没有在网上找到任何解决方案或解释)。

有没有人知道解决方法或如何解决这个问题?

该应用程序在 Hibernate 5.4.6 和 SQL Server 数据库上运行。

示例实体定义:

@Entity
@Table(name = "student")
Public class Student implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", updatable = false, nullable = false)
    private Integer id;

    @Column
    private String first_name;

    @Column
    private String first_name;

    @OneToMany(mappedBy = "student", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<College> colleges = new ArrayList<>();

    // ...Other details and getters/setters omitted
}

@Entity
@Table(name = "college")
Public class College implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", updatable = false, nullable = false)
    private Integer id;

    @Column
    private String name;

    @Column
    private String description;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "student_id")
    private Student student;

    // ...Other details and getters/setters omitted
}

例子:

FROM Student student
JOIN Class clazz ON student.id = clazz.student_id
JOIN student.colleges college

生成的 SQL:

FROM dbo.student AS student
INNER JOIN dbo.college AS college ON student.id = college.student_id
INNER JOIN dbo.class AS clazz ON student.id = clazz.student_id

预期生成的 SQL 应该遵循相同的 JOIN 顺序,但是,它将相关/映射的实体连接放在顶部,并将不相关/未映射的实体连接移动到底部。

标签: javasql-serverhibernatejpahql

解决方案


推荐阅读