如何使用grails查询数据库?

时间:2010-02-10 00:14:50

标签: grails groovy orm

有没有办法查询grails中的2个数据库?

示例(我对两个数据库进行了选择 - 工作和测试):

        select
            c.crf_name,
            c.crf_id,
            ig.group_id,
            ig.group_name,
        from
            works.crfs c,
            test.item_groups ig;

1)我想查询两个数据库,并将结果附加到域。

或者:

2)是否可以将一个查询部分与来自数据库的数据混合,将其他部分与域类混合?

编辑:我需要进行单个查询,混合来自2个数据库的表(一个db是PostgreSQL,其他db是Mysql)。那么,在grails中是否可以在一个查询中混合使用dataSources bean?

编辑2:这是一个更好的例子:

select
    igm.item_id,
    igm.item_group_id as group_id,
    igm.crf_version_id,
    ig.name as group_name
from
    works.item_group_metadata igm,
    test.item_group ig
where
    igm.item_group_id=ig.item_group_id
;

3 个答案:

答案 0 :(得分:3)

如果你计划在{2}数据源上to do your own sql(似乎就是这种情况),我建议你在grails-app / conf / spring中将你的2个数据源定义为Spring bean。

e.g。 (将数据库驱动程序放入/ lib并替换值以匹配RDBMS驱动程序和连接字符串):

import org.apache.commons.dbcp.BasicDataSource
import oracle.jdbc.driver.OracleDriver

beans = { 
    worksDataSource(BasicDataSource) {
        driverClassName = "oracle.jdbc.driver.OracleDriver"
        url = "jdbc:oracle:thin:@someserver:someport:works"
        username = "works"
        password = "workspassword"
     }

     testDataSource(BasicDataSource) {
        driverClassName = "oracle.jdbc.driver.OracleDriver"
        url = "jdbc:oracle:thin:@someserver:someport:test"
        username = "test"
        password = "testpassword"
     }
}

然后创建一个服务来处理您的查询,例如:

import groovy.sql.Sql

class SomeService {
    def worksDataSource
    def testDataSource

    def query1 = """
          SELECT crf_name, crf_id
            FROM works.crfs
    """

    def query2 = """
          SELECT group_id, group_name
            FROM test.item_groups
    """

    def sqlWorks = Sql.newInstance(query1)
    def sqlTest = Sql.newInstance(query2)

    // Then do whatever you like with the results of the 2 queries
    // e.g. 

    sqlWorks.eachRow{ row -> 
       def someDomainObject = new SomeDomainObject(prop1 : row.crf_name, prop2 : crf_id)
       someDomainObject.otherProp = whateverYouLike()
       someDomainObject.save()
    }    
}

您的查询没有where子句,因此我不知道您希望如何关联来自2个表的数据......

如果要进行单个查询混合来自2个数据库的表,(请求您的DBA)在数据库之间建立DBLink测试和工作,并对包含DBLink的数据源执行查询。

我希望这会有所帮助。

答案 1 :(得分:0)

您应该使用大多数数据库支持的“UNION SELECT”。确保两个select语句具有相同的列数。

    select
        crf_name,
        crf_id
    from
        ig
    UNION SELECT
        group_id,
        group_name
    from
        id

联合选择连接2个查询的结果,例如:

select 1 union select 2

答案 2 :(得分:0)

你看过Datasources plugin了吗?听起来它会做你需要的,但我认为你需要直接在域对象上使用HQL或finder,而不是SQL,才能使它工作。

我自己没有使用过该插件,但我很想知道它是怎么回事。

HTH