2010-01-18 2 views

답변

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

이 매우 helpfull했다! – Topera

+0

감사합니다. 그것은 나를 도왔다 ... –

+0

무엇이 나를 위해 누락 되었습니다이 대답은 'def sessionFactory' (내가 당신처럼 컨트롤러 에서이 일을하는 경우) 컨트롤에 표시되어야합니다. 필드가 삽입 된 다음 sessionFactory.currentSession을 수행 할 수 있습니다. – Jason

2

너무 많은 문제없이 직접 매핑 할 수 있습니다. 또는 HQL을 사용하는 경우 select new map()을 사용하고 query.list().collect { new MyDomainObject(it) }을 사용하여 매개 변수를 직접 바인딩 할 수 있습니다. 또한 Grails의 응용 프로그램에서 그루비 SQL을 사용하여

+0

사실,하지만 이것은 Hibernate의 많이 최적화 된 코드보다 상당히 느릴 것이라고 생각합니다. –

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

datasourc 개체를 사용하는 메서드가 없으므로 Sql.newInstance (dataSource)가 실패합니다. – benstpierre

관련 문제