我在使用Groovy (v2.1.7 )编写SQL查询时遇到了一些问题。甚至不要问,为什么它这么旧:) )。因此,我有三个表要连接,我可以通过包含id对的第三个表来连接它们的id。然而,我想创建一个左连接,所以所有东西,即使它在右边是null,都应该进入连接的表-问题是,无论我做什么,包含null的行都不会出现。我怀疑,这是关于配对的桌子,但我不确定。
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查询?
发布于 2015-10-01 01:13:28
尝试使用Groovy Sql对象,它非常简单:
只需在您的类定义下添加defgroovy行,Grails就会注入您的datasource,或者如果只使用dataSource,您可能需要创建一个数据源。然后创建一个Sql对象并使用该对象,它将返回结果的哈希图。
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
发布于 2015-10-02 02:52:03
正如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}"我会尝试上面这样的方法..这是我在join之后直接注释掉所有东西,以获得实际数据。
然后直接检查结果,以防您在代码中遗漏了可能进一步操纵结果的进程
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 ")现在,查看结果集,理论上这应该是表1中的所有内容。如果您现在开始遍历t1..所以
if (results.t1) {
results.t1.each { Table1 entry ->
println "--- ${entry?.sth} @@@ ${entry?.t2s?.ath} "
}
}在域类中,如果您有一些返回实际域类变量实例之外的信息的功能,通常需要首先构建实际对象的列表,然后遍历该列表以查询实际函数。虽然这并不是本场景中实际需要的,并且您所拥有的实际上应该可以正常工作,但这只是一个测试,看看发生了什么。
https://stackoverflow.com/questions/32871425
复制相似问题