想象一下我有这样的事情:
def example = {
def temp = ConferenceUser.findAllByUser(User.get(session.user))
[temp: temp]
}
解释我的问题: 虽然动态查找器非常易于使用和快速学习,但我必须替换我的网站的动态查找器以进行SQL查询,因为这是一项要求。由于我不太了解SQL,我的主要问题是:
a)我使用的是SQLS数据库,驱动程序和数据源配置良好,我的网站就像现在一样工作。如果我想为sql语句替换“findAllByUser”,我应该这样做:
def dataSource
...
def db = new Sql(dataSource)
def temp = db.rows("SELECT ... ")
b)那会有效吗?我的意思是,如果我使用“findAllByUser”,临时对象将是一个列表,我是否需要打开与数据库的连接=?
答案 0 :(得分:22)
使用Grails,您可以使用Dynamic Finders,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())
对象
Grails将自动管理与数据源的连接。
例如:
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 with GORM and GSQL获取了很多很棒的技巧和技巧。
答案 1 :(得分:10)
def UserList = ConferenceUser.executeQuery('from ConferenceUser cu where cu.user = ?', [user]),
你在这里有一个参数化查询 - executeQuery看到了什么?在hql字符串中,并将数组中的参数替换为方法的第二个参数(在本例中为[user]
)。
请参阅 http://grails.org/doc/latest/ref/Domain%20Classes/executeQuery.html
你可以看到如何使用Grails进行SQL查询
答案 2 :(得分:2)
进一步/提示
您可以在Grails应用程序中将groovy.sql.Sql
实例设置为Spring bean。在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”))
并注入豆子
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可以帮助解决这个问题。