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