【发布时间】:2014-02-24 19:08:05
【问题描述】:
如何从普通的 groovy 类中访问数据源?注入不像服务那样起作用。
原因是我需要从 groovy 类中执行一些手动数据库调用(即:使用 groovy.sql.Sql 类的 SQL 语句),因为我正在使用旧数据库。
【问题讨论】:
标签: sql grails groovy datasource code-injection
如何从普通的 groovy 类中访问数据源?注入不像服务那样起作用。
原因是我需要从 groovy 类中执行一些手动数据库调用(即:使用 groovy.sql.Sql 类的 SQL 语句),因为我正在使用旧数据库。
【问题讨论】:
标签: sql grails groovy datasource code-injection
dataSource 是一个 bean,使用时会自动注入 services。默认情况下,所有 bean 都自动连接到 grails 工件(控制器、服务等)中。在您的情况下,您使用的是 POGO,我想它会在 src/groovy 内。
您可以将dataSource bean 显式地注入到 POGO 类中,方法是使其本身成为一个 bean
//resources.groovy
beans = {
myPogo(MyPogo){
dataSource = ref('dataSource')
}
}
//MyPogo.groovy
MyPogo {
def dataSource
....
}
这是一项昂贵的操作。如果您已经在 POGO 中访问 applicationContext 或 grailsApplication,那么您不需要像上面提到的那样创建 bean。
dataSource bean 可以直接从上下文中获取为:
//ctx being ApplicationContext
def dataSource = ctx.getBean('dataSource')
//or if grailsApplication is available
def dataSource = grailsApplication.mainContext.getBean('dataSource')
如果您从 grails 工件调用 POGO 类方法,则使用以下方法而不是上述所有方法。例如:
//service class
class MyService {
def dataSource //autowired
def serviceMethod(){
MyPogo pogo = new MyPogo()
pogo.dataSource = dataSource //set dataSource in POGO
}
}
【讨论】:
进行手动数据库调用的简单解决方案:
def grailsApplication
def getSeqVal () {
SessionFactory sessionFactory = grailsApplication.mainContext.sessionFactory
def sql = "--INSERT QUERY HERE--"
def query = sessionFactory.currentSession.createSQLQuery(sql);
def result = query.list()
return result[0]
}
【讨论】: