Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Grails3.3.0/Gorm:如何使用连接进行查询_Grails_Gorm - Fatal编程技术网

Grails3.3.0/Gorm:如何使用连接进行查询

Grails3.3.0/Gorm:如何使用连接进行查询,grails,gorm,Grails,Gorm,我相信这很容易,但在谷歌或谷歌上找不到任何这样的例子 假设我们有客户和帐户域对象,因此: Class Customer { String name } Class Account { Customer customer BigDecimal balance Currency currency } 如果我没有使用grails,也没有ORM,我将在原始SQL中执行类似的操作: Select c.name, a.balance from customer c, acco

我相信这很容易,但在谷歌或谷歌上找不到任何这样的例子

假设我们有客户和帐户域对象,因此:

Class Customer {
   String name
}

Class Account {
   Customer customer
   BigDecimal balance
   Currency currency
}
如果我没有使用grails,也没有ORM,我将在原始SQL中执行类似的操作:

 Select c.name, a.balance
 from customer c, account a 
 where name like xxx 
       and a.customer_id = c.id
甚至:

 Select c.*, a.balance, a.currency_id
 from customer c, account a 
 where name like xxx 
       and a.customer_id = c.id
甚至:

 Select c.*, a.balance, cur.iso
 from customer c, account a, currency cur 
 where name like xxx 
       and a.customer_id = c.id
       and cur.id = a.currency_id
然而,在grails中,我正在寻找一种方法来返回一组已经加载了帐户的客户。这样我就可以将客户对象传递回视图,而不是字符串列表

这必须作为一个查询来完成,而不是一个查询来获取所有客户,然后每个客户一个查询来获取其余额(可能有数百万客户)

我知道grails会延迟加载,如果我愿意,我可以在每次查询玩家时强制grails加载帐户,但这会影响我想查找客户但不需要余额的时候

我还知道我可以在grails中硬编码SQL/HQL,并将结果作为字符串返回给gsp页面进行呈现,但这与grails不太一样

另外,我不想在播放器中为许多帐户添加链接,因为这可能会严重影响性能,而且不是一个通用的解决方案(我有大约400个域对象,其中许多需要一个连接查询解决方案)

注意,本例假设每个玩家都有一个帐户。如果这不是真的,我会使用外部连接,如果我是通过SQL进行的话。不知道GORM中的等价物是什么


有什么建议吗?

更新答案,因为我没有正确阅读

首先,您提到在视图中执行
gorm
HQL
查询。这也许有一天你会感谢我,但你真的应该试着保持演示文稿作为演示文稿。当您尝试进行查找或复杂决策时,是时候退后一步,思考概念是否需要重新思考,或者如果不可能,如何将此逻辑实现到一个
taglib
中,该库要么工作,要么依靠服务来完成工作

就您所需要的而言,最简单的答案是修改Customer类,并执行一个定制的Set/Let来获取属于其他对象的对象:

Class Customer {
   String name

   Set<Account> getAccounts() { 
         return (Account?.findAll{customer==this} as Set<Account>)
          /// Or write hql you can also add things like take to limit it
         //return Account?.findAllByCustomer(this)?.take(5)
   }
   Account getAccount() { 
         return Account?.find{customer==this} 
   }

}

更新答案,因为我没有正确阅读

首先,您提到在视图中执行
gorm
HQL
查询。这也许有一天你会感谢我,但你真的应该试着保持演示文稿作为演示文稿。当您尝试进行查找或复杂决策时,是时候退后一步,思考概念是否需要重新思考,或者如果不可能,如何将此逻辑实现到一个
taglib
中,该库要么工作,要么依靠服务来完成工作

就您所需要的而言,最简单的答案是修改Customer类,并执行一个定制的Set/Let来获取属于其他对象的对象:

Class Customer {
   String name

   Set<Account> getAccounts() { 
         return (Account?.findAll{customer==this} as Set<Account>)
          /// Or write hql you can also add things like take to limit it
         //return Account?.findAllByCustomer(this)?.take(5)
   }
   Account getAccount() { 
         return Account?.find{customer==this} 
   }

}

那么grails/gorm没有一种一次性检索player和account对象的方法?以上将是我的最后手段,因为这意味着我不能重复使用我的任何模板或视图,因为它们期望正确的客户和帐户对象,而不是任意的结果集。上述情况在我的应用程序中非常常见(想要返回具有连接的对象),如果grails不能处理它,它会大大降低它的价值。当然,它确实会,但是你已经用sql查询开始了这个问题,所以给出了一个答案来满足你的查询需要。我添加了一个findAll方法,可以做类似的事。问题的关键是客户。findAll(..)不会从帐户加载余额。在普惠制中,如果我试图显示余额,例如${customer[x].account.balance)可能会对数据库执行另一个查询。使用account.findAll加载所有帐户不会给我提供一个客户集合,因此我不确定这会有什么帮助。更新的答案如果这是一个在我的repos上带有分页queuekit/queuemail插件的用户列表,您应该查看完整的hql查询,例如so grails/gorm没有一种一次性检索播放器和帐户对象的方法?以上是我的最后手段,因为这意味着我不能重复使用任何模板或视图,因为它们希望得到正确的客户和帐户对象,而不是任意的结果集。上述情况在我的应用程序中非常常见(希望返回具有联接的对象),如果grails不能处理它,它会大大降低它的价值。当然,它确实会,但是你已经用sql查询开始了这个问题,所以给出了一个答案来满足你的查询需要。我添加了一个findAll方法,可以做类似的事。问题的关键是客户。findAll(…)不会从帐户加载余额。在GSP中,如果我尝试显示余额,例如${customer[x].account.balance)可能会对数据库执行另一个查询。使用account.findAll加载所有帐户不会给我提供一个客户集合,因此我不确定这会有什么帮助。更新的答案如果这是一个在我的repos上带有分页queuekit/queuemail插件的用户列表,您应该查看完整的hql查询
String query= """Select new map(c.name as name, a.balance as balance) 
 from Customer c, Account a
 where name like :name
  and a.customer.id = c.id
"""


Map mp=[:]
name='%'+params.name+'%'

def result=Account.executeQuery(query,mp,[readOnly:true])