首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Grails中的executeQuery

Grails中的executeQuery
EN

Stack Overflow用户
提问于 2015-10-01 00:39:39
回答 2查看 2.5K关注 0票数 0

我在使用Groovy (v2.1.7 )编写SQL查询时遇到了一些问题。甚至不要问,为什么它这么旧:) )。因此,我有三个表要连接,我可以通过包含id对的第三个表来连接它们的id。然而,我想创建一个左连接,所以所有东西,即使它在右边是null,都应该进入连接的表-问题是,无论我做什么,包含null的行都不会出现。我怀疑,这是关于配对的桌子,但我不确定。

代码语言:javascript
复制
Table1 {
  id
  sth
}

Table2 {
  id
  ath
}

Table3 {
  t1id
  t2id
}

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

代码语言:javascript
复制
static hasMany = [t2s: Table2]

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

我的SQL查询如下所示:

代码语言:javascript
复制
Table1.executeQuery(
   "SELECT t1.sth, t2.ath " +
   "FROM Table1 t1 LEFT JOIN t1.t2s t2 " +
   "WHERE t1.sth = ......)

有没有其他方法可以用Grails编写SQL查询?

EN

回答 2

Stack Overflow用户

发布于 2015-10-01 01:13:28

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

只需在您的类定义下添加defgroovy行,Grails就会注入您的datasource,或者如果只使用dataSource,您可能需要创建一个数据源。然后创建一个Sql对象并使用该对象,它将返回结果的哈希图。

代码语言:javascript
复制
def dataSource

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

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

代码语言:javascript
复制
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

票数 0
EN

Stack Overflow用户

发布于 2015-10-02 02:52:03

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

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

就像现在这样……:

代码语言:javascript
复制
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

实际上,您也可以尝试其他方法来查看正在发生的事情,因此:

代码语言:javascript
复制
def results = Table1.executeQuery(
   "SELECT new map(t1 as t1)  " +
   "FROM Table1 t1 ")

现在,查看结果集,理论上这应该是表1中的所有内容。如果您现在开始遍历t1..所以

代码语言:javascript
复制
if (results.t1) { 
 results.t1.each { Table1 entry -> 
     println "--- ${entry?.sth} @@@ ${entry?.t2s?.ath} "
 }
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32871425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档