Запросы Grails sql
Представьте, что у меня есть что-то вроде этого:
def example = {
def temp = ConferenceUser.findAllByUser(User.get(session.user))
[temp: temp]
}
Объяснение моей проблемы:
Хотя динамические искатели очень просты в использовании и быстрому изучению, я должен заменить динамические искатели моего сайта на sql-запросы, потому что это требование. Поскольку я не очень разбираюсь в SQL, мои основные вопросы:
a) Я использую базу данных SQLS с хорошими настройками драйверов и данных, и мой сайт работает так, как сейчас. Если я хочу заменить "findAllByUser" для оператора sql, должен ли я сделать что-то вроде этого:
def dataSource
...
def db = new Sql(dataSource)
def temp = db.rows("SELECT ... ")
b) И это сработает? Я имею в виду, что временный объект будет списком, как если бы я использовал "findAllByUser", и мне нужно открыть соединение с базой данных =?
Ответы
Ответ 1
да, с помощью grails вы можете выполнять как простые запросы sql, так и hql. HQL - это "язык запросов на гибернацию" и позволяет писать SQL-подобные операторы, но используйте ваши классы и свойства домена вместо имен таблиц и имен столбцов. Чтобы выполнить запрос hql, сделайте что-то вроде
def UserList = ConferenceUser.executeQuery('from ConferenceUser cu where cu.user = ?', [user]),
что у вас здесь есть параметризованный запрос - executeQuery видит? в строке hql и заменяет аргументы в массиве, который является вторым параметром метода ([user]
в этом случае) для вас.
См
http://grails.org/doc/latest/ref/Domain%20Classes/executeQuery.html
и вы можете увидеть это как выполнить sql-запросы с помощью Grails
Запрос Sql для вставки в grails
Ответ 2
С помощью Grails вы можете использовать Динамические поисковые машины, Criteria Builders, Hibernate Query Language (HQL) или Groovy SQL.
Использовать Groovy SQL:
-
import groovy.sql.Sql
- Запросить ссылку на источник данных с
def dataSource
или def sessionFactory
для транзакций
- Создайте объект
Sql
, используя def sql = new Sql(dataSource)
или def sql = new Sql(sessionFactory.currentSession.connection())
- Используйте Groovy SQL по мере необходимости
Grails автоматически будет управлять подключением к источнику данных.
Sql.rows возвращает список, который можно передать на view.
Например:
import groovy.sql.Sql
class MyController {
def dataSource
def example = {
def sql = new Sql(dataSource)
[ temp: sql.rows("SELECT . . .") ]
}
}
И в рамках транзакции:
import groovy.sql.Sql
class MyController {
def sessionFactory
def example = {
def sql = new Sql(sessionFactory.currentSession.connection())
[ temp: sql.rows("SELECT . . .") ]
}
}
Я рекомендую книгу Grails Persistence с GORM и GSQL для множества полезных советов и приемов.
Ответ 3
Далее/советы
- Использовать Spring beans
Вы можете сделать экземпляр groovy.sql.Sql
a Spring bean в своем приложении Grails. В grails-app/conf/spring/resources.groovy
определите Sql bean:
// File: grails-app/conf/spring/resources.groovy
beans = {
// Create Spring bean for Groovy SQL.
// groovySql is the name of the bean and can be used
// for injection.
sql(groovy.sql.Sql, ref('dataSource'))
}
Затем введите экземпляр Sql в свой класс.
package com.example
import groovy.sql.GroovyRowResult
class CarService {
// Reference to sql defined in resources.groovy.
def sql
List<GroovyRowResult> allCars(final String searchQuery) {
final String searchString = "%${searchQuery.toUpperCase()}%"
final String query = '''\
select id, make, model
from car
where ...
'''
// Use groovySql bean to execute the query.
final results = sql.rows(query, search: searchString)
results
}
}
-
Несколько источников данных
adminSql (groovy.sql.Sql, ref ( "dataSource_admin" ))
userSql (groovy.sql.Sql, ref ( "dataSource_user" ))
и введите beans
def userSql
def adminSql
В службы, которые в них нуждаются.
или без инъекции
import groovy.sql.Sql
// ...
// inject the datasource bean
def dataSource_admin
// ...
// in a method
Sql sql = new Sql(dataSource_admin)
Ранняя версия Grails
Циклирование с помощью наборов результатов GORM в ранних версиях Grails может вызвать ненужные запросы в середине шаблонных циклов. Использование groovy SQL может помочь с этим.