Запросы 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 может помочь с этим.