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

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

图中有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.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;
}