如何使用gsp中的params对grails执行查询?

时间:2014-12-14 10:07:44

标签: sql hibernate grails

我需要知道如何使用params在grails上执行本机sql查询?
目前我有一些查询字符串,其中包含一些涉及3个表和一个UNION的SQL 我们的想法是使用gsp文件调用中给定的'params'值运行查询,这与执行时相同:DomainClass.list(params)

我的电话目前是:

        def session = sessionFactory.getCurrentSession()
        def results = session.createSQLQuery(query).list()

如何使用参数调用执行查询?

2 个答案:

答案 0 :(得分:2)

为什么不使用动态查找程序或创建条件? 我想知道将参数放在String中是否会使您暴露于SQL注入攻击(不必要的风险)。

动态查找器看起来像这样:

Company ACME = Company.findByName(params.MyValue)
Product.findAllByManufacturer(params.MyValue)
Product.findAllByManufacturerAndSalesPriceBetween(params.MyValue, 200, 500)

标准看起来像这样:

Transaction.createCriteria().list {
    projections {
        groupProperty 'product'
        sum 'quantity'
    }

    product {
        manufacturer {
            eq 'id', params.MyValue
        }
    }
}

这些是我从这个优秀教程中得到的例子:

http://tatiyants.com/how-and-when-to-use-various-gorm-querying-options/

说真的,不要将查询参数放在字符串中。

答案 1 :(得分:0)

有关Groovy的SQL参考,请参阅this页面。

最简单的选择是注入dataSource bean并从中生成一个SQL对象,如下所示:

def dataSource

def someMethod() {
    def sql = new Sql(dataSource)
    sql.eachRow("select this, that from table where q = ${params.q} limit ${params.max}") { row ->
        //...do some work here or use a different method on the SQL object
    }
}

Groovy不仅会执行通常的字符串插值,而且会将您的值转换为可以安全地传递给数据库的参数。