Использование Hibernate HQL именованных запросов в Grails? - PullRequest
3 голосов
/ 11 января 2012

Есть ли способ использовать именованные запросы Hibernate в Grails, используя HQL?

Я читал о них в книге Использование Hibernate и задавался вопросом, существует ли способчтобы использовать их в Grails.

Именованные запросы включены вместе с отображениями классов в <class-name>.hbm.xml файлы сопоставления, например, так:

<query name="com.oreilly.hh.tracksNoLongerThan">
   <![CDATA[
         from Track as track
           where track.playTime <= :length
     ]>
</query>

Теперь я уверен, что <class-name>.hbm.xml файл отображения hibernate может быть включен и интегрирован в конфигурацию Grails GORM как здесь указано , что hibernate.cfg.xml, который включает в себя файл отображения hibernate , можетиспользуется в Grails.

В старых Hibernate и Java к нему можно получить доступ следующим образом:

    ...
Query query = session.getNamedQuery(
                "com.oreilly.hh.tracksNoLongerThan");

query.setTime("length", length);
return query.list();
    ...

Но как можно получить доступ к этим именованным запросам HQL из Grails?

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

1 Ответ

5 голосов
/ 12 января 2012

Самый простой способ - использовать метод withSession для любого класса домена, например,

SomeDomainClass.withSession { session ->
   Query query = session.getNamedQuery('com.oreilly.hh.tracksNoLongerThan')
   query.setTime 'length', length
   query.list()
}

или более компактно, используя цепочку методов:

SomeDomainClass.withSession { session ->
   session.getNamedQuery('com.oreilly.hh.tracksNoLongerThan')
      .setTime('length', length)
      .list()
}
...