如何在Grails 2.4.0中编写本机SQL查询?

时间:2017-06-08 13:44:06

标签: mysql hibernate grails groovy

我正在使用Grails 2.4.0。我想在Groovy Controller中执行本机查询。查询如下:

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

首先,我执行上述查询,但它没有找到 REPLACE 函数,如:

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

如何在其中执行 REPLACE 功能?

其次,我有一些R& D,但执行原生查询需要sessionFactory。无法理解如何在 Grails 2.4.0 中获取当前Hibernate会话来执行本机查询?

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

为了使用本机查询,我们可以使用SessionFactory,它是一个bean,我们可以简单地将它声明给我们的Grails控制器或服务,依赖注入将处理它。以下是使用此bean执行本机查询的示例代码。

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
    }
}