Более сложные именованные запросы в Hibernate - PullRequest
0 голосов
/ 18 июля 2011

У меня есть запрос, который объединяет и группирует из 2 разных таблиц: SELECT co.name AS companyName, f.destination_id, COUNT(f.id) AS numberOfFlights FROM companies co INNER JOIN flights f ON co.c_id = f.company_id GROUP BY co.id, co.name , f.destination_d

и я хотел бы сохранить его в файле сопоставления xml как именованный запрос.Мои вопросы: 1. Хотя, как вы можете видеть, не все поля результатов являются фактическими столбцами в любой таблице - как я могу сообщить это в файл карты?2. В каком xml я должен сохранить его - на compant.hbm.xml или flight.hbm.xml, или - есть ли способ сохранить его на hibernate.cfg.xml?

Я искалСеть для продвинутых примеров, но не нашла ничего подходящего для такого рода осложнений (хотя это не так сложно ...).

Может ли кто-нибудь дать мне хороший пример, из которого я могу поучиться, или может помочья сам?

Ответы [ 3 ]

3 голосов
/ 19 июля 2011

По вопросу 1 взгляните на ResultTransformer.Просто создайте bean-компонент с теми же именами, что и результаты вашего запроса, и передайте его ResultTransformer в вызове Transformers.aliasToBean, как упомянуто здесь: Hibernate: отображение имен пользовательских столбцов в хранимой процедуре с именем query

По вопросу 2, по крайней мере, в нашем проекте мы поместили наши именованные запросы в файл XML, который содержит только запросы, и ссылаемся на него из hibernate.cfg.xml с помощью следующей строки:

<mapping resource="queries.hbm.xml" />
1 голос
/ 18 июля 2011

Я использую JPA, который, как я полагаю, также поддерживается Hibernate, и просто создаю файл XML в подходящем каталоге в META-INF, а затем обращаюсь к нему из моего файла persistence.xml

<persistence-unit name="xxx">
    <jta-data-source>jdbc/xxx</jta-data-source>
    <mapping-file>META-INF/jpql/Xxx.xml</mapping-file>

Когда у меня есть «дополнительные» данные, такие как ваш счетчик, я часто определяю класс результатов с подходящим cnmstructor, а затем использую

  select new MyClass( thing, computedValue etc ...)

в моем запросе. Похоже, что Hibernate поддерживает такой подход.

0 голосов
/ 18 июля 2011

Вы можете поместить именованный запрос в файл отображения Hibernate (http://www.javalobby.org/java/forums/m91885316.html), если вы используете отображения XML, или с аннотацией (http://download.oracle.com/javaee/6/api/index.html?javax/persistence/NamedQuery.html), если вы используете аннотации.

Еще один вариант, особенно если вы объединяете элементы в запросе с другими сопоставлениями, - это создать базу данных, ПОСМОТРЕТЬ карту в Hibernate.

...