私がこのようなものを持っていると想像してください:
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」を使用すると、一時オブジェクトはそのままリストになり、データベースへの接続を開く必要がありますか?
はい、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では、 Dynamic Finders 、 Criteria Builders 、 Hibernate Query Language(HQL) 、または Groovy SQL を使用できます。
使用するには Groovy SQL :
import groovy.sql.Sql
_def dataSource
_または_def sessionFactory
_を使用してデータソースへの参照を要求しますdef sql = new Sql(dataSource)
またはdef sql = new Sql(sessionFactory.currentSession.connection())
を使用して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 多くの優れたヒントとテクニックについて。
さらに進む/ヒント
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バージョンでGORM結果セットをループすると、テンプレートループの途中で不要なクエリが発生する可能性があります。 groovy SQLを使用すると、これに役立ちます。