java - 生成的 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 顺序,但是,它将相关/映射的实体连接放在顶部,并将不相关/未映射的实体连接移动到底部。
解决方案
推荐阅读
- python - 如何在线性回归模型中使用字符串中的日期
- selenium - 如何使用 selenium 抓取具有多个页面的数据表?
- android - 我正在尝试完成我的转换应用程序的最后一个组件,“指向互惠航向的指南针航向”。使用安卓工作室
- c++ - LVGL 功能未定义 - 为什么?
- php - 正则表达式在 . , : 字符(和一些例外)
- android - Kotlin - 如何传递一个具有类构造函数的函数,它有自己的参数作为可组合的参数?
- python-3.x - 如何在文章中添加图片?
- mysql - Symfony(带有教义)迁移不适用于有效的 mysql 函数创建请求
- javascript - 当 webscraping youtube 页面时,视频返回和空对象,但 video.src 返回一个值
- java - Java Spring Boot PersistenceException (OneToMany)