Как использовать JOIN с помощью session.createSQLQuery () Hibernate - PullRequest
1 голос
/ 14 января 2011

У меня есть две сущности (таблицы) - сотрудник и проект.Сотрудник может иметь несколько проектов.Поле CREATOR_ID таблицы проекта ссылается на поле идентификатора таблицы Employee.Сущность Employee не поддерживает никаких ссылок на Project, но сущность Project имеет ссылку на Employee.

При использовании EntityManager следующий запрос работает нормально -

entityManager.createQuery(
    "select e from EmployeeDTO e, ProjectDTO p"
    + " where p.id = ?1 and p.creator.id=e.id");

Но так как у меня есть связь LAZYЯ получаю сообщение об ошибке:

Не удалось инициализировать прокси-сервер - нет сеанса

, если я пытаюсь получить доступ к информации о проекте из сущности Employee.Это ожидаемо, поэтому я использую сеанс Hibernate для создания запроса, как показано ниже.

Session session = HibernateUtil.getSessionFactory().openSession();
org.hibernate.Query q = session.createSQLQuery(
    "SELECT E FROM EMPLOYEE_TAB E, PROJECT_TAB P  WHERE P.ID = "
    + projectId + " AND P.CREATOR_ID = E.ID")
    .addEntity("EmployeeDTO ", EmployeeDTO.class)
    .addEntity("ProjectDTO", ProjectDTO.class);

Но я получаю сообщение об ошибке: «Столбец« E »либо отсутствует в какой-либо таблице в списке FROM, либо отображается вспецификация соединения и выходит за рамки спецификации соединения ... "

Кто-нибудь может подсказать, какой будет правильный синтаксис JOIN для такого случая?Если я использую ("SELECT * FROM EMPLOYEE_TAB E, ........") - это выдает другую ошибку:

java.lang.ClassCastException: [Ljava.lang.Object;невозможно преобразовать в com.im.server.dto.EmployeeDTO

.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 14 января 2011

Вам не нужно использовать собственный SQL-запрос для предварительной выборки ProjectDTO s при загрузке EmployeeDTO.Ваш исходный запрос может быть переписан более элегантным образом следующим образом:

select e from EmployeeDTO e join e.projects p where p.id = ?1

Затем вы можете добавить предложение join fetch для предварительной выборки проектов:

select distinct e from EmployeeDTO e join e.projects p join fetch e.projects where p.id = ?1

См. Также:

0 голосов
/ 14 января 2011

Ваш SQL начинается с SELECT E from EMPLOYEE E ..., вы имеете в виду SELECT E.*, P.* from EMPLOYEE E ...?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...