简体   繁体   中英

How to write a native SQL query in Grails 2.4.0?

I am working on Grails 2.4.0. I want to execute the native query in Groovy Controller. The query is as follow:

SELECT AVG(REPLACE(n.ep_text, 'PPM', '')), MONTH(n.date_creat) 
from notification n
where n.type = 42
GROUP BY MONTH(n.date_creat)

Firstly, I execute the above query but it's have not found the REPLACE function like:

String query1 = "SELECT n.id, avg(REPLACE(n.epText, 'PPM', '')) FROM Notification as n";
def result  = Notification.executeQuery(query1.toString())

How can I able to execute the REPLACE function in it?

And secondly, I have some R&D on it, but to execute the native query to required the sessionFactory . Unable to understand how to get the current session of Hibernate in Grails 2.4.0 to execute the native query?

Any help would be appreciated.

In order to use a native query, we can use SessionFactory, which is a bean and we can simply declare it to our Grails controller or service and dependency injection will handle it. Here is sample code using this bean to execute a native query.

class PublicService {
    def sessionFactory
    def getMatchedValue(){
        def currentSession = sessionFactory.currentSession
        def q = "select bank.id as id, bank.credit_amount as creditAmount, bank.debit_amount as debitAmount, bank.transaction_date as transactionDate, bank.transaction_name as transactionName, receipt.cr_date as crDate, receipt.picture_reference as pictureReference, receipt.receipt_date as receiptDate, receipt.reimbursment as reimbursment, receipt.total_amount as totalAmount, receipt.vendor as vendor " +
                "from bank inner join receipt on bank.debit_amount=receipt.total_amount where ((bank.transaction_date >= receipt.receipt_date) and (bank.transaction_date <= DATE_ADD(receipt.receipt_date, INTERVAL 5 DAY) ))"//sample native query
        def data = currentSession.createSQLQuery(q)
        data.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);//if you are using alias for query e.g bank.credit_amount as creditAmount
        final result = data.list()
        return result
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM