我需要知道如何使用params在grails上执行本机sql查询?
目前我有一些查询字符串,其中包含一些涉及3个表和一个UNION的SQL
我们的想法是使用gsp文件调用中给定的'params'值运行查询,这与执行时相同:DomainClass.list(params)
我的电话目前是:
def session = sessionFactory.getCurrentSession() def results = session.createSQLQuery(query).list()
如何使用参数调用执行查询?
答案 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不仅会执行通常的字符串插值,而且会将您的值转换为可以安全地传递给数据库的参数。