2014-04-30 90 views
0

在我的grails应用程序中有一个Customer域和相关的客户表。 还有另一个由java web应用程序使用的数据库,它也具有客户域和相关的客户表。如何通过grails中的多个数据库进行搜索

另请注意,这两个应用程序使用两个不同的数据库。

在我的grails应用程序中有一个客户搜索屏幕,当用户用一个字符串搜索客户时,我需要在两个数据库中搜索记录。

我如何在grails中实现这个要求?

我可以在不是由grails生成的数据库表上使用GORM吗(我想,我可以用hibernate映射来做到这一点)?

回答

1

我们可以通过两种方式做到这一点:

  1. 使用格姆(如果他们有一些相同的列)
  2. 使用查询

方法1:

创建两个DataSource.groovy中的数据源。 对于已创建的数据库,在定义数据源时不要提供dbcreate选项。这将防止何时创建客户对象,它只会在Test1数据库中创建记录。 这两个数据库都有客户表。所以我们可以使用GORM访问数据。为此,必须在域中定义数据源“ALL”

Test1的客户表包含姓名和年龄栏 Test2的客户表包含姓名,电子邮件和电话。

通过GORM,我们只能访问域属性。所以我只能从Test2的客户表访问名字。

在DataSource.groovy中,

dataSource { 
    pooled = true 
    driverClassName = "com.mysql.jdbc.Driver" 
    username = "admin" 
    password = "admin" 
} 
hibernate { 
    cache.use_second_level_cache = true 
    cache.use_query_cache = false 
    cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory' // Hibernate 3 
// cache.region.factory_class = 'org.hibernate.cache.ehcache.EhCacheRegionFactory' // Hibernate 4 
} 

// environment specific settings 
environments { 
    development { 
     dataSource { 
      dbCreate = "update" // one of 'create', 'create-drop', 'update', 'validate', '' 
      url = "jdbc:mysql://localhost:3306/test1" 
     } 
     dataSource_test2 { 
      driverClassName = 'com.mysql.jdbc.Driver' 
      username = "admin" 
         password = "admin" 
      url = "jdbc:mysql://localhost:3306/test2" 
     } 
    } 
    test { 
     dataSource { 
      dbCreate = "update" 
      url = 



    "jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE" 
       } 
      } 
    .......... 
    ....... 

在Customer.groovy,

class Customer { 

    static constraints = { 
    } 
    String name 
    int age 

    static mapping = { 
     datasource 'ALL' 
    } 
} 

在控制器,

class CustomerController { 

    def dataSource_test2 

    def testingDB(){ 
      Customer.test2.list().each{ 
       println it.name 
      } 
      println Customer.list() 
      render "hi" 

    } 
} 

方式2:

class MainController { 

def dataSource_test2 

    def index() { 
     String nameSql = "select * from customer" 
     Sql sql = new Sql(dataSource_test2) 
     def rows = sql.rows(nameSql) 
     println rows 

    } 

} 
1

这个直接的前进与下列选项:

1.您可能需要定义一个新的数据库环境在您的数据源groovy文件只是为其他Java Web应用程序的数据库源。

newenvironmentname { 
     dataSource { 
      dbCreate = "update" // one of 'create', 'create-drop', 'update', 'validate', '' 
      url = "jdbc:mysql://localhost:3306/test1" 
     } 

然后,当您要访问控制器上的此数据源时,加载或切换到环境中。

2。你需要使用Groovy和

import groovy.sql.Sql 
sql = Sql.newInstance('jdbc:jtds:sqlserver: 
     //serverName/dbName-CLASS;domain=domainName', 'username', 'password' 
     ,'net.sourceforge.jtds.jdbc.Driver') 
sql.eachRow('select * from tableName') 
      { println "$it.id -- ${it.firstName} --" } 

这可能不是最好的办法,以遵循定义SQL连接...