【问题标题】:How to execute query on grails using params from gsp?如何使用 gsp 中的参数对 grails 执行查询?
【发布时间】:2014-12-14 10:07:43
【问题描述】:

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

我的电话目前是:

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

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

【问题讨论】:

  • 您正在运行作为请求本身的一部分传递的查询?
  • 无法回答您的问题。我正在运行一个包含 2 个选择部分和一个联合的查询,总表数量为 3。
  • 是的,但是您在问题中暗示查询文本本身提供了一些字符串,该字符串是请求本身的一部分。如果我的理解正确,这是一个非常糟糕的主意,请不要这样做!
  • 我想问的是你想做这样的事情吗:sql.executeQuery(params.query)?

标签: sql hibernate grails


【解决方案1】:

您为什么不使用动态查找器或创建标准? 我想知道将您的参数放在字符串中是否会使您面临 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/

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

【讨论】:

  • 虽然通常建议不要将请求参数连接到 SQL 查询中,但在 Groovy 中,您可以使用字符串插值安全地执行此操作 - 它们在发送到数据库之前被转换为 SQL 参数,因此您可以安全性不亚于User.findByUsername(params.user)。请参阅this documentation article 中的避免 SQL 注入一章。
【解决方案2】:

请参阅this 页面以获取 Groovy 的 SQL 参考。

您最简单的选择是注入 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 不仅会进行通常的字符串插值,而且实际上会将您的值转换为可以安全地传递到数据库的参数。

【讨论】:

  • 查询中的“q”是什么意思?
  • 这只是一个使用params 变量来构造查询的示例(这是您的问题所在) - 由您来构建实际的查询并在其中使用您的参数。
  • 另外,如何对结果进行分页?
  • 由于您使用的是原生 SQL,它依赖于底层数据库;例如,在 Postgresql 中,在查询结束时会这样写:limit ${params.max} offset ${params.offset}
  • 是用于分页的“偏移”值吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-18
  • 1970-01-01
  • 2015-07-05
  • 1970-01-01
  • 2015-07-07
  • 2021-04-01
  • 2015-12-28
相关资源
最近更新 更多