Grails SQL запросов - PullRequest
       0

Grails SQL запросов

10 голосов
/ 08 июня 2011

Представьте, что у меня есть что-то вроде этого:

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 ... ")

б) И это будет работать?Я имею в виду, что временный объект будет таким же списком, как если бы я использовал «findAllByUser», и мне нужно было бы открыть соединение с базой данных =?

Ответы [ 3 ]

22 голосов
/ 08 июня 2011

С Grails вы можете использовать Динамические искатели , Построители критериев , Язык запросов Hibernate (HQL) или Groovy SQL .

Для использования Groovy SQL :

  1. import groovy.sql.Sql
  2. Запросить ссылку на источник данных с def dataSource или def sessionFactory для транзакций
  3. Создание объекта Sql с использованием def sql = new Sql(dataSource) или def sql = new Sql(sessionFactory.currentSession.connection())
  4. Использование Groovy SQL при необходимости

Grails будет управлятьподключение к источнику данных автоматически.

Sql.rows возвращает список, который можно передать в представление .

Например:

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 с GORM и GSQL для большого количества полезных советов и приемов.

10 голосов
/ 08 июня 2011

да, с помощью 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 голосов
/ 26 января 2017

Идем дальше / Советы

  • Использование бобов Spring

Вы можете сделать экземпляр groovy.sql.Sql пружинойбоб в вашем приложении Grails.В grails-app/conf/spring/resources.groovy определите bean-компонент Sql:

// 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"))

и добавление бинов

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...