Здесь есть 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, который выглядел так:
1-й запрос
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
ошибки, когда я использую этот 3 - й запрос: (запрос, который выбирает loginId
типа String
из reportingOfficer
без имени псевдонима для Employee
)
3-й запрос
SELECT
reportingOfficer.loginId
FROM
data.persistence.ordb.Employee
WHERE
department.name = 'Inventory Control'
AND
designation.name = 'Assistant Manager'
Но я получаю ту же ошибку Invalid Path
когда я использую этот 4-й запрос: (предназначен для выбора designation
типа Designation
reportingOfficer
без псевдонима для Employee
)
4-й запрос
SELECT
reportingOfficer.designation
FROM
data.persistence.ordb.Employee
WHERE
department.name = 'Inventory Control'
AND
designation.name = 'Assistant Manager'
И этот 5-й запрос дает правильные результаты: (выбирает designation
типа Designation
reportingOfficer
с псевдонимом для Employee
)
Пятый запрос
SELECT
e.reportingOfficer.designation
FROM
data.persistence.ordb.Employee e
WHERE
e.department.name = 'Inventory Control'
AND
e.designation.name = 'Assistant Manager'
Мой вопрос: почему имя псевдонима требуется в случае 2-го и 5-го запросов, но не в третьем запросе?
Это очень просто:
И сущность, которую вы выбираете (Entity), и объект, который вы хотите спроецировать (reportOfficer), относятся к одному типу объекта: Employee.
public class Employee implements java.io.Serializable
private Employee reportingOfficer;
}
Если вы не используете псевдоним, Hibernate не будет знать, к какому "департаменту" вы обращаетесь. Это тот, который вы выбираете, или тот, который вы хотите выбрать (reportOfficer).
Мое золотое правило - всегда использовать псевдонимы, даже если это не необходимо.
Не использовать псевдонимы, как полагаться на операторский порядок, вместо использования скобок.
reportingOfficer.loginId
как зимуют теперь от гдеreportingOfficer
получить называют?