在Grails中使用Hibernate HQL命名查询?

lee*_*d00 3 grails hibernate hql named-query grails-orm

有没有办法使用HQL在Grails中使用Hibernate命名查询?

我在Harnessing Hibernate一书中一直在阅读它们,并想知道是否有办法在Grails中使用它们.

在如下的<class-name>.hbm.xml映射文件中包含命名查询以及类映射:

<query name="com.oreilly.hh.tracksNoLongerThan">
   <![CDATA[
         from Track as track
           where track.playTime <= :length
     ]>
</query>
Run Code Online (Sandbox Code Playgroud)

现在我确定可以包含一个<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();
    ...
Run Code Online (Sandbox Code Playgroud)

但是,如何从Grails访问这些HQL命名查询?

我问的原因是我希望能够获取遗留数据库并将其映射到某些对象以便在Grails中使用,并将命名查询与映射一起存储.

Bur*_*ith 5

最简单的方法是使用withSession任何域类的方法,例如

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

或更紧凑地使用方法链接:

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