Grails sql查询

时间:2011-06-08 16:52:39

标签: sql grails

想象一下我有这样的事情:

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”,临时对象将是一个列表,我是否需要打开与数据库的连接=?

3 个答案:

答案 0 :(得分:22)

使用Grails,您可以使用Dynamic FindersCriteria BuildersHibernate Query Language (HQL)Groovy SQL

使用Groovy SQL

  1. import groovy.sql.Sql
  2. 请求使用def dataSourcedef sessionFactory进行交易的数据源
  3. 使用Sqldef sql = new Sql(dataSource)
  4. 创建def sql = new Sql(sessionFactory.currentSession.connection())对象
  5. 根据需要使用Groovy SQL
  6. 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 with GORM and GSQL获取了很多很棒的技巧和技巧。

答案 1 :(得分:10)

是的,使用grails你可以做普通的sql和hql查询。 HQL是'hibernate query language',允许您编写类似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

你可以看到如何使用Grails进行SQL查询

Sql query for insert in grails

答案 2 :(得分:2)

进一步/提示

  • 使用Spring beans

您可以在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版

在早期grails版本中通过GORM结果集循环可能会在模板循环中导致不必要的查询。使用groovy SQL可以帮助解决这个问题。