Использование Hibernate для выполнения запроса с двумя таблицами - PullRequest
1 голос
/ 09 февраля 2010

В целом я неопытен в sql, поэтому использование Hibernate похоже на поиск ответа, прежде чем я точно знаю, что это за вопрос. Пожалуйста, не стесняйтесь исправлять любые мои недоразумения. Я нахожусь на проекте, где я должен использовать Hibernate. Большая часть того, что я делаю, довольно проста, и я могу копировать и изменять.

Теперь я хотел бы сделать что-то другое, и я не уверен, как нужно объединять конфигурацию и синтаксис. Допустим, у меня есть две таблицы.

Таблица A имеет два (соответствующих) столбца, GUID пользователя и GUID менеджера. Очевидно, что менеджеры могут иметь более одного пользователя, поэтому запросы к менеджеру могут возвращать более одной строки. Кроме того, менеджер может управлять одним и тем же пользователем в нескольких проектах, поэтому один и тот же пользователь может возвращаться несколько раз для одного и того же запроса менеджера.

Таблица B состоит из двух столбцов: GUID пользователя и полное имя пользователя. Индивидуальное отображение там.

Я хочу сделать запрос по GUID менеджера из таблицы A, сгруппировать их по уникальному GUID пользователя (чтобы один и тот же пользователь не попал в результаты дважды), а затем вернуть полные имена этих пользователей из таблицы B.

Я мог бы сделать это в SQL без особых проблем, но я хочу использовать Hibernate, чтобы мне не приходилось анализировать результаты SQL вручную. Это один из пунктов использования Hibernate, не так ли?

Прямо сейчас у меня есть отображения Hibernate, которые отображают каждый столбец в Таблице A на поле (я полагаю, методы get / set) в объекте DAO, который я написал для хранения данных этой Таблицы.

Я также мог бы использовать DAO Hibernate, которые мне нужны для доступа к каждой таблице отдельно и выполнять каждую из вещей, упомянутых выше, в отдельных шагах, но это было бы менее эффективно (я полагаю), чем выполнение одного запроса.

Я написал объект Service для хранения данных, возвращаемых из запроса (мой пример упрощен - я собираюсь сохранить некоторые другие данные из таблицы A и получить несколько столбцов из таблицы B), но я в потеря из-за того, как написать DAO, которая может выполнить объединение, или использовать DAO, которые я должен выполнить.

К вашему сведению, вот пример моего файла конфигурации hibernate (упрощенный, чтобы соответствовать моему примеру):

<hibernate-mapping package="com.my.dao">
  <class name="TableA" table="table_a">
  <id name="pkIndex" column="pk_index" />
  <property name="userGuid" column="user_guid" />
  <property name="managerGuid" column="manager_guid" />
  </class>
</hibernate-mapping>

Итак, у меня есть класс DAOImplementation, который выполняет запросы и возвращает списки типа

public List<TableA> findByHQL(String hql, Map<String, String> params)

и т.д.. Я не уверен, насколько это "лучшая практика".

1 Ответ

3 голосов
/ 09 февраля 2010

Хорошо. Во-первых, я заметил, что вы в основном говорите о таблицах в своем вопросе, поэтому я думаю, что вы упускаете важный момент в Hibernate. Hibernate - это инструмент ORM ( Object-Relational Mapping ), который помогает сопоставить объекты с реляционной моделью и манипулировать данными, используя объектную парадигму.

Таким образом, при использовании Hibernate вы должны думать об объектах, которые имеют ассоциации между ними, а не о таблицах. И под объектами я имею в виду бизнес-объекты , такие как Project, Employee, а не DAO. DAO являются способом моделирования уровня доступа к данным технологически независимым способом (JDBC, Hibernate и т. Д.), Они не представляют записи базы данных. Файлы отображения Hibernate используются для отображения этих объектов в таблицы и для описания их связей.

Другими словами, вместо «TableA» и «TableB» я ожидал бы прочитать что-то вроде (это всего лишь пример, конечно):

У меня есть Employee класс, Employee может работать на Project в качестве участников проекта или в качестве менеджера проекта. Я использую связь «многие ко многим» между Project и Employee для членов команды и связь «многие к одному» между Project и Employee для менеджера проекта. Вот файлы отображения Hibernate и соответствующие классы Java ...

Затем, чтобы запросить эту модель, вы должны снова подумать об объектах. Опять же, этот пример вымышленный (он не имеет смысла без объектной модели и связанных отображений), но ваш HQL-запрос может выглядеть следующим образом:

select distinct project.teamMembers 
from Project as project 
where project.projectManager.id=:id 

Подводя итог, я думаю, что вам нужно переосмыслить свою проблему и пути ее решения. Прямо сейчас вы, кажется, на неправильном пути.

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