How can I get access to the data source from within a normal groovy class? Injection doesn't work like it does with services.
The reason for this is that I need to do some manual database calls (ie: SQL statements using the groovy.sql.Sql class) from the groovy class since I'm working with a legacy database.
dataSource
is a bean which gets auto injected in services
when used. All beans are auto wired in grails artifacts (controllers, services etc) by default. In your case you are using a POGO and I suppose it would be inside src/groovy
.
You can inject the dataSource
bean explicitly to POGO class by making it a bean by itself
//resources.groovy
beans = {
myPogo(MyPogo){
dataSource = ref('dataSource')
}
}
//MyPogo.groovy
MyPogo {
def dataSource
....
}
This is an expensive operation. If you already are accessing applicationContext
or grailsApplication
in POGO then you need not create a bean as mentioned above.
dataSource
bean can be directly fetched from the context as:
//ctx being ApplicationContext
def dataSource = ctx.getBean('dataSource')
//or if grailsApplication is available
def dataSource = grailsApplication.mainContext.getBean('dataSource')
If you are invoking the POGO class methods from a grails artifact then use below approach than all of the above approaches. For example:
//service class
class MyService {
def dataSource //autowired
def serviceMethod(){
MyPogo pogo = new MyPogo()
pogo.dataSource = dataSource //set dataSource in POGO
}
}
Simple solution to do manual database calls:
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]
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With