Начиная с Hibernate 5.1 , он начал предлагать нам возможность объединять две несвязанные сущности, как мы это делаем в нативном SQL. Это фантастическая особенность! Однако недавно я столкнулся с неожиданным поведением этой функции. У меня был запрос со смешанными JOIN (левыми и внутренними соединениями) с обоими связанными сущностями и несвязанными сущностями. В сгенерированном SQL все несвязанные сущности JOINs находятся в нижней части запроса, что вызвало следующее исключение: 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 должен следовать тому же порядку соединений, однако он помещает сущности Related / Mapped в верхнюю часть иперемещает несвязанные / несопоставленные сущности. Присоединяется к основанию.