Hibernate/persistence without @Id

后端 未结 9 853
梦谈多话
梦谈多话 2020-11-28 09:07

I have a database view that yields a result set that has no true primary key. I want to use Hibernate/Persistence to map this result set onto Java objects. Of course, becaus

9条回答
  •  臣服心动
    2020-11-28 09:44

    Instead of searching for workarounds in Hibernate it might be easier to add dummy id in your database view. Let's assume that we have PostgreSQL view with two columns and none of them is unique (and there is no primary key as Postgres doesn't allow to make PK or any other constraints on views) ex.

    | employee_id | project_name |
    |:------------|:-------------|
    | 1           | Stack01      |
    | 1           | Jira01       |
    | 1           | Github01     |
    | 2           | Stack01      |
    | 2           | Jira01       |
    | 3           | Jira01       |
    ------------------------------
    

    Which 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 dummy id using row_number():

    SELECT row_number() OVER (ORDER BY subquery.employee_id) AS row_id
    

    like 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;
    

    Like 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;
    
    //Getters, setters etc.
    
    }
    

提交回复
热议问题