Использование Hibernate для выполнения запроса с участием двух таблиц

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

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

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

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

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

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

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

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

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

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

<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)

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


person Nathan Spears    schedule 09.02.2010    source источник


Ответы (1)


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

Таким образом, при использовании 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 

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

person Pascal Thivent    schedule 09.02.2010
comment
Ах. И затем в этой вымышленной модели я просматривал бы список членов команды, получая их полные имена? Дополнительный вопрос: в Hibernate могу ли я иметь несколько сопоставлений с одной и той же таблицей? Другими словами, могу ли я оставить существующие сопоставления и создать альтернативный набор сопоставлений в некоторых из тех же таблиц для нужных мне объектов? - person Nathan Spears; 09.02.2010
comment
@ Натан Первый вопрос: да. Второй вопрос: да, вы можете иметь несколько сущностей (и, следовательно, несколько сопоставлений), сопоставленных с одной таблицей. - person Pascal Thivent; 09.02.2010