2014-12-14 8 views
1

Мне нужно знать, как выполнить собственный SQL-запрос на grails с помощью параметров?
В настоящее время у меня есть запрос String, который содержит некоторый SQL, который связан с 3 таблицами и UNION.
Идея заключается в том, чтобы выполнить запрос, используя значение данного «Params» из GSP файла вызова же, как это сделано, делая как: DomainClass.list (Params)
Как выполнить запрос по grails с использованием параметров из gsp?

Мой вызов в настоящее время:

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

Как я могу вызвать запрос выполнения с помощью параметров?

+0

Выполняется запрос, который был передан как часть самого запроса. –

+0

Не может получить ваш вопрос. Я выполняю запрос, который имеет 2 части выбора и объединение, общая сумма таблиц равна 3. – roeygol

+0

Да, но вы подразумевали в своем вопросе, что в самом тексте запроса была предоставлена ​​некоторая строка, которая была частью самого запроса. Если я правильно вас понял, это феноменально плохая идея, пожалуйста, не делайте этого! –

ответ

2

Почему вы не используете Dynamic Finders или Create Criteria? Интересно, может ли размещение ваших параметров в String подвергнуть вас атаке SQL Injection (ненужный риск).

Dynamic Finders будет выглядеть следующим образом:

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/

Серьезно, не пла Параметры запроса в строке.

+2

Хотя в общем случае это хорошая рекомендация не связывать параметры запроса с SQL-запросами, в Groovy вы можете сделать это безопасно с использованием строковой интерполяции - они преобразуются в параметры SQL перед отправкой в ​​базу данных, поэтому вы не менее безопасны, чем использование 'User .findByUsername (params.user) '. См. Главу * Избегание SQL-инъекции * в [этой статье документации] (http://groovy.codehaus.org/gapi/groovy/sql/Sql.html). –

0

См. Ссылку this для ссылки на Groovy.

Ваш самый простой вариант, чтобы впрыснуть dataSource боб и генерировать объект 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 не просто делать обычную строку интерполяции, но на самом деле преобразовать значения в параметры, которые могут безопасно передаваться в базу данных.

+0

Что означает «q» в вашем запросе? – roeygol

+0

Это просто пример использования переменной params для построения запроса (в чем ваш вопрос был) - вам решать построить фактический запрос и использовать в нем свои параметры. –

+0

ok .. Как можно комбинировать параметр 'offset' и 'max'? – roeygol