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])