Search code examples
javasqlhibernateormhql

how do i convert SQL query to HQL


public class EmployeeUserMap {

    @ManyToOne
    @JoinColumn(name = "EMPLOYEEID", unique = true)
    protected Employee employee;

    @ManyToOne
    @JoinColumn(name="USERID")
    private User user;
}

public class RoleUserMap  {


    @ManyToOne
    @JoinColumn(name = "ROLEID")
    private Role role;


    @ManyToOne
    @JoinColumn(name = "USERID")
    private User user;


}

Below is my SQL query.

select e.id ,e.firstname from employee_user_map o
          left join role_user_map ru on ru.userid = o.userid
          left join employee e on e.id = o.employeeid
          where  ru.roleid =  (select r.id from role r  where r.code='Role_Merchant')

HQL query i tried.

 SELECT new com.erp.core.repository.value.LookupValue(o.id,o.firstName,o.firstName) FROM EmployeeUserMap o
            LEFT JOIN o.user =
            WHERE /*@{SYSTEM_CRITERIA}*/1=1 AND (UPPER(o.firstName) LIKE UPPER(CONCAT('%',:searchParam,'%')))

Solution

  • Assuming you have your mappings right, you should form the hql query as:

    Hibernate version < 5.1.0:

      select new   com.erp.core.repository.value.LookupValue(e.id,e.firstName) 
          from EmployeeUserMap eu
             , RoleUserMap ru
             , Employee e
             , User u
             , Role r
          where  r.code ='Role_Merchant'
              and eu.user = u
              and ru.user = u
              and ru.role =r
              and eu.employee = e 
    

    dont think you really need the subquery here..

    Update: for version 5.1.0+ of HIbernate it is possible to use unrelated entity joins, so in your case:

      select new com.erp.core.repository.value.LookupValue(e.id,e.firstName) 
      from EmployeeUserMap o
        left join o.user u
        left join o.employee e
        left join RoleUserMap ru on ru.user.id = u.id
        left join ru.role r
      where  r.code ='Role_Merchant'