Tôi đang cố gắng để có được các truy vấn gốc để làm việc với InheritanceType.JOINED
. Từ Hibernate documentation Tôi đã tìm thấy:Thêm đối tượng có InheritanceType.JOINED vào truy vấn gốc
13.1.6. Xử lý thừa kế
Truy vấn SQL gốc truy vấn đối tượng được ánh xạ như một phần của kế thừa phải bao gồm tất cả các thuộc tính cho bảng phân lớp và tất cả các lớp con của nó.
Sử dụng hai đối tượng sau đây:
@Data
@Entity
@Table(name = "my_super")
@EqualsAndHashCode(of = {"id"})
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class MySuper {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private long id;
}
Và:
@Data
@Entity
@Table(name = "my_sub_a")
@EqualsAndHashCode(callSuper = true)
public class MySubA extends MySuper {
@Column(name = "x")
private int x;
}
Khi tôi cố gắng tạo ra một truy vấn nguồn gốc sử dụng:
Object actual = session
.createNativeQuery("SELECT {s.*} FROM my_super {s} LEFT JOIN my_sub_a {a} USING (id)")
.addEntity("s", MySuper.class)
.getSingleResult();
Nó dịch với truy vấn :
SELECT s.id as id1_1_0_, s_1_.x as x1_0_0_, case when s_1_.id is not null then 1 when s.id is not null then 0 end as clazz_0_ FROM my_super s LEFT JOIN my_sub_a a USING (id)
Và sau đó không thành công với:
javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not prepare statement
Caused by: org.hibernate.exception.SQLGrammarException: could not prepare statement
Caused by: org.h2.jdbc.JdbcSQLException: Column "S_1_.X" not found; SQL statement:
Vì vậy, chúng ta quan sát tiêm bí danh làm công việc của mình, tìm ra rằng nó có thể cần x
cột của my_sub_a
là tốt. Tuy nhiên, không thể tìm ra bí danh cho my_sub_a
. Mã của tôi nên được sửa đổi như thế nào để bí danh này được kết nối đúng cách?
Mã của tôi có sẵn tại https://gist.github.com/JWGmeligMeyling/51e8a305f3c268eda473511e202f76e8 để dễ dàng tái tạo sự cố của tôi.
(Tôi biết rằng truy vấn này có thể dễ dàng được thể hiện bằng JPQL hoặc HQL là tốt, và thậm chí có thể đạt được bằng cách sử dụng EntityManager
và Session
API. Tôi tuy nhiên muốn sử dụng này trong một truy vấn phức tạp hơn, mà tôi đơn giản hóa tất cả các chi tiết cần thiết cho câu hỏi này).
Bạn nên có lẽ một trong hai thay thế '{a}' với 'a', hoặc thêm một '.addEntity ("a", MySubA .class) ', vì nó rối tung với các bí danh. Nhưng đây chỉ là một thử –
Những gì tôi nhận được từ các tài liệu bạn đã trích dẫn là bạn cần phải bao gồm các thuộc tính của một trong lựa chọn vì vậy có thể 'SELECT {s. *}, {A. *} [...]'. Ngoài ra tôi nghĩ bạn nên thử '.addEntity (" a ", MySubA.class)' mà không có lớp siêu vì nó có thể sẽ không khởi tạo một lớp trừu tượng. – drakyoko
Không, không phải vậy, nếu tôi sử dụng '.addEntity (" a ", MySubA.class)', Hibernate giả định nó cần tìm nạp hai thực thể riêng biệt, thay vì tìm ra các thuộc tính thuộc về cùng một thực thể. Rằng tôi sử dụng một '{a}' không được trả lời trong truy vấn của tôi thực sự là một lỗi sao chép-dán. –