Instead of finding workarounds in Hibernate, it might be easier to add a dummy identifier in the database view. Suppose we have a PostgreSQL view with two columns, and none of them is unique (and there is no primary key, since Postgres does not allow PK or any other restrictions on the views) ex.
| employee_id | project_name | |:------------|:-------------| | 1 | Stack01 | | 1 | Jira01 | | 1 | Github01 | | 2 | Stack01 | | 2 | Jira01 | | 3 | Jira01 | ------------------------------
What is represented by the following query:
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
We can add a dummy id using row_number ():
SELECT row_number() OVER (ORDER BY subquery.employee_id) AS row_id
as in this example:
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;
And the table will look like this:
| row_id | employee_id | project_name | |:------------|:------------|:-------------| | 1 | 1 | Stack01 | | 2 | 1 | Jira01 | | 3 | 1 | Github01 | | 4 | 2 | Stack01 | | 5 | 2 | Jira01 | | 6 | 3 | Jira01 | -------------------------------------------
Now we can use row_id as @Id in JPA / Hibernate / Spring Data:
@Id @Column(name = "row_id") private Integer id;
As in the example:
@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;
luke May 18 '17 at 14:13 2017-05-18 14:13
source share