2012-01-11 50 views
2

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

我在Harnessing Hibernate book上一直在阅读关于它们,并想知道是否有方法在Grails中使用它们。

命名查询都包括在内,与类映射一起,在<class-name>.hbm.xml映射文件,像这样:

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

现在,我敢肯定,一个<class-name>.hbm.xmlHibernate映射文件可以包含并融入Grails GORM配置为it is stated here,其中hibernate.cfg.xml其中包括休眠映射文件可以在Grails中使用。

在旧的Hibernate和Java可以访问这种方式:

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

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

但是,一个人如何可以访问Grails的这些命名查询HQL?

我问的原因是我希望能够将遗留数据库映射到Grails中使用的某些对象,并将指定的查询与映射一起存储。

+0

P.S.我已经看到在Grails文档中对命名查询的引用... http://grails.org/doc/2.0.x/ref/Domain%20Classes/namedQueries.html – leeand00 2012-01-11 18:15:33

回答

5

最简单的方法是在任何域类上使用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() 
}