grails

时间:2015-09-30 16:39:39

标签: sql grails gorm

我在Groovy中编写SQL查询时遇到了一些问题(v2.1.7。甚至不问,为什么它这么老:))。所以我有三个表加入,我可以加入他们的id,通过第三个,包含id对。但是,我想创建一个左连接,所以所有内容,即使它在右侧都为null,也应该进入连接表 - 问题是,无论我做什么,包含空值的行都没有&#39 ; t出现。我怀疑,它是关于配对的桌子,但我不确定。

Table1 {
  id
  sth
}

Table2 {
  id
  ath
}

Table3 {
  t1id
  t2id
}

在其Groovy文件中,Table1在Table2上有一个hasMany关系。

static hasMany = [t2s: Table2]

据我所知,我必须加入这些关系。

我的SQL查询如下:

Table1.executeQuery(
   "SELECT t1.sth, t2.ath " +
   "FROM Table1 t1 LEFT JOIN t1.t2s t2 " +
   "WHERE t1.sth = ......)

还有其他方法可以在Grails中编写SQL查询吗?

2 个答案:

答案 0 :(得分:0)

尝试使用Groovy Sql对象,这非常简单:

只需在类定义下添加def dataSource行,Grails将注入您的dataSource,或者如果仅使用Groovy,则可能需要创建数据源。然后创建一个Sql对象并使用Object,它将返回结果的哈希映射。

def dataSource

Sql sql = new Sql(dataSource)
def rows = sql.rows("select * from PROJECT where name like 'Gra%'")

以下是如何创建自己的数据源:

def db = [url:'jdbc:hsqldb:mem:testDB', user:'sa', password:'', driver:'org.hsqldb.jdbc.JDBCDriver']
def sql = Sql.newInstance(db.url, db.user, db.password, db.driver)

这里有大部分内容来自Sql对象文档:

http://docs.groovy-lang.org/latest/html/api/groovy/sql/Sql.html

答案 1 :(得分:0)

正如Emmanuel指出的那样,进一步的信息可能包括查询的其余部分可能有助于确定您的问题。

第三个表是由grails创建的,用于保持与其他许多人之间的关系。

现在看来......:

def results = Table1.executeQuery(
   "SELECT t1.sth, t2.ath " +
   "FROM Table1 t1 LEFT JOIN t1.t2s t2 ") //+
   //"WHERE t1.sth = ......)

println "-- ${results.size()} "
println "-- ${results}"

我会尝试类似上面的内容..这是我在加入后直接评论所有内容以获取实际数据。

然后直接检查结果,以防您在代码中缺少可能进一步操作结果的进程

E2A:

看看这里并尝试搞乱findAll http://grails.github.io/grails-doc/1.2.1/api/org/codehaus/groovy/grails/orm/hibernate/metaclass/FindAllPersistentMethod.html

因为它是你也可以尝试其他事情来看看发生了什么:

def results = Table1.executeQuery(
   "SELECT new map(t1 as t1)  " +
   "FROM Table1 t1 ")

现在有了这一套 看看结果这在理论上应该是表格中的所有内容..如果你现在开始迭代t1 ..那么

if (results.t1) { 
 results.t1.each { Table1 entry -> 
     println "--- ${entry?.sth} @@@ ${entry?.t2s?.ath} "
 }
}

在域类中,如果您有一些功能可以返回实际域类变量实例之外的信息,那么通常首先构建实际对象的列表,然后遍历它以查询实际函数。虽然这不是这个场景中实际需要的,而你实际上只需要工作,这只是一个测试,看看发生了什么......