Hibernate Query Language: для выбора некоторых свойств требуется псевдоним

1

Здесь есть 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-го запросов, но не в третьем запросе?

Теги:
hibernate
hql

1 ответ

2
Лучший ответ

Это очень просто:

И сущность, которую вы выбираете (Entity), и объект, который вы хотите спроецировать (reportOfficer), относятся к одному типу объекта: Employee.

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

Если вы не используете псевдоним, Hibernate не будет знать, к какому "департаменту" вы обращаетесь. Это тот, который вы выбираете, или тот, который вы хотите выбрать (reportOfficer).

Мое золотое правило - всегда использовать псевдонимы, даже если это не необходимо.

Не использовать псевдонимы, как полагаться на операторский порядок, вместо использования скобок.

  • 0
    В этом случае reportingOfficer.loginId как зимуют теперь от где reportingOfficer получить называют?
  • 0
    Предложение FROM является отправной точкой (например, ROOT) и может определять местоположение «[ROOT] .reportingOfficer.loginId». При указании «отдела» это может быть [ROOT] .department или [ROOT] .reportingOfficer.department, поэтому есть двусмысленность.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню