这里有3个班级:
Employee.java
,Department.java
和Designation.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次查询?
答案 0 :(得分:2)
这很简单:
您选择的实体(实体)和您要投影的实体(reportingOfficer)都属于同一实体类型:Employee。
public class Employee implements java.io.Serializable
private Employee reportingOfficer;
}
如果您不使用别名,Hibernate将不知道您指的是哪个“部门”。是您选择的那个还是您想要选择的那个(reportingOfficer)。
我的黄金法则是即使在没有必要时也总是使用别名。
不使用别名就像依靠operator order而不是使用括号。