2010-01-18 18 views

cevap

18
import com.acme.domain.* 

def sessionFactory 
sessionFactory = ctx.sessionFactory // this only necessary if your are working with the Grails console/shell 
def session = sessionFactory.currentSession 

def query = session.createSQLQuery("select f.* from Foo where f.id = :filter)) order by f.name"); 
query.addEntity(com.acme.domain.Foo.class); // this defines the result type of the query 
query.setInteger("filter", 88); 
query.list()*.name; 
+0

bu çok yararlı oldu! – Topera

+0

Teşekkürler. Bu bana da yardımcı oldu ... –

+0

Bu cevapta benim için eksik olan şey, 'def oturumuFactory'nin kontrolde görünmesi gerektiğidir (eğer bunu benim gibi bir denetleyicide yapıyorsanız). Alan enjekte edilir ve daha sonra sessionFactory.currentSession'ı yapabilirsiniz. – Jason

2

Kendinizi çok fazla sorun olmadan haritalayabilirsiniz. Alternatif olarak HQL kullanıyorsanız, parametreleri select new map() kullanabilir ve daha sonra parametreleri el ile bağlamak için query.list().collect { new MyDomainObject(it) }'u kullanabilirsiniz. Alternatif Grails app Groovy SQL kullanarak

+0

Doğru, ancak bunun, Hibernate'in ağır şekilde optimize edilmiş kodlarından önemli ölçüde daha yavaş olacağını varsayalım. –

8

import groovy.sql.Sql 

class TestQService{ 

    def dataSource //Auto Injected 

    def getBanksForId(int bankid){ 

     def sql = Sql.newInstance(dataSource) 

     def rows = sql.rows(""" Select BnkCode , BnkName from Bank where BnkId = ?""" , [bankid]) 

     rows.collect{ 
      new Bank(it) 
     } 

    } 


    class Bank{ 

     String BnkCode 
     String BnkName 

     } 

} 
+0

Sql.newInstance (dataSource), bir veri yığını nesnesini alan hiçbir yöntem olmadığından başarısız olur. – benstpierre

İlgili konular