Thay vì tìm kiếm cách giải quyết trong Hibernate, có thể dễ dàng thêm id giả trong chế độ xem cơ sở dữ liệu của bạn. Giả sử rằng chúng ta có chế độ xem PostgreSQL với hai cột và không có cột nào là duy nhất (và không có khóa chính nào vì Postgres không cho phép tạo PK hoặc bất kỳ ràng buộc nào khác trên các khung nhìn).
| employee_id | project_name |
|:------------|:-------------|
| 1 | Stack01 |
| 1 | Jira01 |
| 1 | Github01 |
| 2 | Stack01 |
| 2 | Jira01 |
| 3 | Jira01 |
------------------------------
nào được đại diện bởi các truy vấn sau đây:
CREATE OR REPLACE VIEW someschema.vw_emp_proj_his AS
SELECT DISTINCT e.employee_id,
pinf.project_name
FROM someschema.project_info pinf
JOIN someschema.project_employee pe ON pe.proj_id = pinf.proj_id
JOIN someschema.employees e ON e.employee_id = pe.emloyee_id
Chúng ta có thể thêm id giả sử dụng row_number():
SELECT row_number() OVER (ORDER BY subquery.employee_id) AS row_id
như trong ví dụ này:
CREATE OR REPLACE VIEW someschema.vw_emp_proj_his AS
SELECT row_number() OVER (ORDER BY subquery.employee_id) AS row_id,
subquery.employee_id,
subquery.project_name
FROM
(SELECT DISTINCT e.employee_id,
pinf.project_name
FROM someschema.project_info pinf
JOIN someschema.project_employee pe ON pe.proj_id = pinf.proj_id
JOIN someschema.employees e ON e.employee_id = pe.emloyee_id) subquery;
Và bảng sẽ trông giống như thi s:
| row_id | employee_id | project_name |
|:------------|:------------|:-------------|
| 1 | 1 | Stack01 |
| 2 | 1 | Jira01 |
| 3 | 1 | Github01 |
| 4 | 2 | Stack01 |
| 5 | 2 | Jira01 |
| 6 | 3 | Jira01 |
-------------------------------------------
Bây giờ chúng ta có thể sử dụng row_id như @ id trong JPA/Hibernate/Dữ liệu mùa xuân:
@Id
@Column(name = "row_id")
private Integer id;
Giống như trong ví dụ:
@Entity
@Table(schema = "someschema", name = "vw_emp_proj_his")
public class EmployeeProjectHistory {
@Id
@Column(name = "row_id")
private Integer id;
@Column(name = "employee_id")
private Integer employeeId;
@Column(name = "project_name")
private String projectName;
//Getters, setters etc.
}
này sẽ gây ra vấn đề nếu bộ nhớ cache được sử dụng – NimChimpsky