В целом я неопытен в 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)
и т.д.. Я не уверен, насколько это "лучшая практика".