Java Hibernate查询语言:选择某些属性需要别名
图中有3类:Java Hibernate查询语言:选择某些属性需要别名,java,hibernate,hql,Java,Hibernate,Hql,图中有3类: Employee.java、Department.java和Designation.java 下面是每一个的部分定义 Department.java 名称.java Employee.java 我尝试了一个如下所示的HQL查询: 第一个问题 它给了我一个错误: org.hibernate.hql.ast.QuerySyntaxException: Invalid Path: 'department.name' 但是,当我为data.persistence.ordb.Employe
Employee.java
、Department.java
和Designation.java
下面是每一个的部分定义
Department.java
名称.java
Employee.java
我尝试了一个如下所示的HQL查询:
第一个问题
它给了我一个错误:
org.hibernate.hql.ast.QuerySyntaxException: Invalid Path: 'department.name'
但是,当我为data.persistence.ordb.Employee
使用别名时,我得到了正确的结果,如下所示:
第二个问题
另外,当我使用第三个查询时,我没有得到无效路径
错误:(选择loginId
类型String
的reportingOfficer
的Employee
没有别名的查询)
第三个问题
但是,当我使用第四个查询时,我得到了相同的无效路径
错误:(用于选择报告办公室
的类型
的指定
,员工没有别名)
第四项质询
第5次查询给出了正确的结果:(选择报告办公室的类型的指定
,其别名为员工
)
第五项质询
我的问题是:为什么在第二次和第五次查询时需要别名,而在第三次查询时不需要别名?很简单:
从中选择的实体(实体)和要项目的实体(reportingOfficer)都属于同一实体类型:Employee
public class Employee implements java.io.Serializable
private Employee reportingOfficer;
}
如果您不使用别名,Hibernate将不知道您指的是哪个“部门”。是您从中选择的还是您想要选择的(reportingOfficer)
我的金科玉律是即使不必要也要使用别名
不使用别名就像依赖于而不是使用括号一样。在这种情况下,reportingOfficer.loginId
现在如何从引用reportingOfficer
的位置休眠?from子句是起点(例如根),它可以定位“[ROOT].reportingOfficer.loginId”。指定“部门”时,它可以是[ROOT].department或[ROOT].reportingOfficer.department,因此存在歧义。
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
}
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'
SELECT
e.reportingOfficer
FROM
data.persistence.ordb.Employee e
WHERE
e.department.name = 'Inventory Control'
AND
e.designation.name = 'Assistant Manager'
SELECT
reportingOfficer.loginId
FROM
data.persistence.ordb.Employee
WHERE
department.name = 'Inventory Control'
AND
designation.name = 'Assistant Manager'
SELECT
reportingOfficer.designation
FROM
data.persistence.ordb.Employee
WHERE
department.name = 'Inventory Control'
AND
designation.name = 'Assistant Manager'
SELECT
e.reportingOfficer.designation
FROM
data.persistence.ordb.Employee e
WHERE
e.department.name = 'Inventory Control'
AND
e.designation.name = 'Assistant Manager'
public class Employee implements java.io.Serializable
private Employee reportingOfficer;
}