Search code examples
spring-bootjpajpql

JPA Entity class which is not mapped to any table


I am using a entity class for mixing two/three table columns in one entity to hold an outcome of SYS_REFCURSOR in oracle

This allows me to have single class which is not mapped to any table but it still is an Entity

@Data
@Entity
@NoArgsConstructor
class EmployeeDetails {
    @Id
    @Column("emp_id")
    String empId;
    
    @Column("job_name")
    String jobName;

    @Column("dept_name")
    String deptName;

    //Future requirement
    //String updatedBy
}

Now I have an additional requirement, to add who last modified the employee table, I don't want modify the procedure now, the procedure is being re-used in another background procedure and batch jobs.

My question is, is it possible to use @ManyToOne on this class which is obviously not mapped to any table

If not how do avoid manually looping a child array list, is there a ready made option in JPA or spring boot to achieve that.

Or what will be the smartest/recommended way to bring the below Entity into this class

@Data
@Entity
@NoArgsConstructor
@Table(name="app_users")
class AppUsers {

    @Id
    @Column(name="user_id")
    String userId;

    @Column
    String userName;
}

Solution

  • My spring boot 2.6.2 EntityManager code is as follows

    q = em.createStoredProcedureQuery("MY_PROC",EmployeeDetails.class);
    q.registerStoredProcedureParameter("OUT_REFC", void.class, ParameterMode.REF_CURSOR);
    q.execute();
    q.getResultList()
    

    I have modified my class EmployeeDetails as below

    @Data
    @Entity
    @NoArgsConstructor
    class EmployeeDetails {
        @Id
        @Column("emp_id")
        String empId;
        
        @Column("job_name")
        String jobName;
    
        @Column("dept_name")
        String deptName;
    
        @OneToOne
        @JoinColumn(
          name="user_id",
          referencedColumnName="emp_id", 
          insertable=false, 
          updatable=false, 
          nullable=true
        )
        AppUsers updatedBy;
    }
    

    The log prints Hibernate two times one after one as below, first it calls the proc and then it calls the select query, so, I did not wrote that SQL myself, the JPA layer is taking care of it

    Hibernate:
      {call MY_PROC(?)}
    Hibernate:
      select 
       ...
       ...
      from app_users
     where user_id=?
    

    so, my expectation achieved and I am getting the values