web-dev-qa-db-ja.com

GrailsS​​QLクエリ

私がこのようなものを持っていると想像してください:

def example = {
   def temp = ConferenceUser.findAllByUser(User.get(session.user))
   [temp: temp]
}

私の問題の説明:動的ファインダーは非常に使いやすく、習得も速いですが、SQLクエリの動的ファインダーを置き換える必要があります。私はSQLをあまり理解していないので、私の主な質問は次のとおりです。

a)SQLSデータベースを使用しており、ドライバーとデータソースが適切に構成されており、Webサイトは現在のように機能しています。 SQLステートメントの「findAllByUser」を置き換えたい場合は、次のようにする必要があります。

def dataSource
...
def db = new Sql(dataSource)
def temp = db.rows("SELECT ... ")

b)そしてそれはうまくいくでしょうか?つまり、「findAllByUser」を使用すると、一時オブジェクトはそのままリストになり、データベースへの接続を開く必要がありますか?

10
VictorArgentin

はい、grailsを使用すると、プレーンSQLクエリとhqlクエリの両方を実行できます。 HQLは「Hibernateクエリ言語」であり、SQLのようなステートメントを記述できますが、テーブル名と列名の代わりにドメインクラスとプロパティを使用します。 hqlクエリを実行するには、次のようにします。

def UserList = ConferenceUser.executeQuery('from ConferenceUser cu where cu.user = ?', [user]),  

ここにあるのはパラメータ化されたクエリです-executeQueryは? hql文字列で、メソッドの2番目のパラメータである配列の引数を置き換えます([user]この場合)あなたのために。

http://grails.org/doc/latest/ref/Domain%20Classes/executeQuery.html を参照してください。

grailsでSQLクエリを実行する方法でこれを見ることができます

grailsに挿入するためのSQLクエリ

10
hvgotcodes

Grailsでは、 Dynamic FindersCriteria BuildersHibernate Query Language(HQL) 、または Groovy SQL を使用できます。

使用するには Groovy SQL

  1. _import groovy.sql.Sql_
  2. トランザクションについては、_def dataSource_または_def sessionFactory_を使用してデータソースへの参照を要求します
  3. def sql = new Sql(dataSource)またはdef sql = new Sql(sessionFactory.currentSession.connection())を使用してSqlオブジェクトを作成します
  4. 必要に応じて 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 . . .") ]
    }
}
_

私は本を​​お勧めします GORMとGSQLを使用したGrails Persistence 多くの優れたヒントとテクニックについて。

22
jamesallman

さらに進む/ヒント

  • Spring Beanを使用

Grailsアプリケーションでgroovy.sql.SqlインスタンスをSpringBeanにすることができます。 grails-app/conf/spring/resources.groovyで、SQLBeanを定義します。

// 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バージョン

初期のgrailsバージョンでGORM結果セットをループすると、テンプレートループの途中で不要なクエリが発生する可能性があります。 groovy SQLを使用すると、これに役立ちます。

2
chim