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