Hibernate查询语言:选择一些属性需要别名

时间:2014-07-14 12:20:48

标签: java hibernate hql

这里有3个班级: Employee.javaDepartment.javaDesignation.java

以下是每个......的部分定义。

Department.java

public class Department implements java.io.Serializable
{   private Integer id;
    private String name;
    // getters and setters for all propreties
}

Designation.java

public class Designation implements java.io.Serializable
{   private Integer id;
    private String name;
    // getters and setters for all propreties
}

Employee.java

public class Employee implements java.io.Serializable
{   private Integer id;
    private Employee reportingOfficer;
    private Department department;
    private Designation designation;
    private String loginId;
    // getters & setters for all propreties
}

我尝试了一个看起来像这样的HQL查询:

第一次查询

SELECT
  reportingOfficer
FROM
  data.persistence.ordb.Employee
WHERE
  department.name = 'Inventory Control'
  AND
  designation.name = 'Assistant Manager'

它给了我一个错误:

org.hibernate.hql.ast.QuerySyntaxException: Invalid Path: 'department.name'

但是,当我使用data.persistence.ordb.Employee的别名时,我得到了正确的结果,如下所示:

第二次查询

SELECT
  e.reportingOfficer
FROM
  data.persistence.ordb.Employee e
WHERE
  e.department.name = 'Inventory Control'
  AND
  e.designation.name = 'Assistant Manager'

另外,当我使用第三个查询时,我没有收到Invalid Path错误:(查询选择loginId String reportingOfficer Employee SELECT reportingOfficer.loginId FROM data.persistence.ordb.Employee WHERE department.name = 'Inventory Control' AND designation.name = 'Assistant Manager' 而没有别名{ {1}})

第三次查询

Invalid Path

但是当我使用第4个查询时,我得到了相同的designation错误:(旨在选择Designation reportingOfficer Employee SELECT reportingOfficer.designation FROM data.persistence.ordb.Employee WHERE department.name = 'Inventory Control' AND designation.name = 'Assistant Manager' 而不使用{{1}的别名}})

第4次查询

designation

此第5个查询提供了正确的结果:(选择Designation的{​​{1}} reportingOfficer Employee,别名SELECT e.reportingOfficer.designation FROM data.persistence.ordb.Employee e WHERE e.department.name = 'Inventory Control' AND e.designation.name = 'Assistant Manager' }

第五次查询

{{1}}

我的问题是:为什么在第二和第二的情况下需要别名。第5次查询,但不是第3次查询?

1 个答案:

答案 0 :(得分:2)

这很简单:

您选择的实体(实体)和您要投影的实体(reportingOfficer)都属于同一实体类型:Employee。

public class Employee implements java.io.Serializable
    private Employee reportingOfficer;
}

如果您不使用别名,Hibernate将不知道您指的是哪个“部门”。是您选择的那个还是您想要选择的那个(reportingOfficer)。

我的黄金法则是即使在没有必要时也总是使用别名。

不使用别名就像依靠operator order而不是使用括号。