Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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
在Grails中延迟加载关联时,如何修改Hibernate生成的SQL?_Hibernate_Grails - Fatal编程技术网

在Grails中延迟加载关联时,如何修改Hibernate生成的SQL?

在Grails中延迟加载关联时,如何修改Hibernate生成的SQL?,hibernate,grails,Hibernate,Grails,我在Oracle数据库中有三个具有以下关联的表: 公司、用户、设置 一家公司有很多用户 一个用户有许多设置 设置具有引用公司的外键(换句话说,一个公司具有多个设置) 设置表按公司进行分区,并具有关于用户的索引 我试图让Hibernate生成一个查询,以便在利用分区的同时,通过将公司包括在查询中,惰性地加载用户的设置。目前,正在编写以下Grails代码: def settings = user.settings 以下(简化)查询的结果: 我希望在调用上面的Grails代码时生成以下查询: SEL

我在Oracle数据库中有三个具有以下关联的表:

公司、用户、设置 一家公司有很多用户 一个用户有许多设置 设置具有引用公司的外键(换句话说,一个公司具有多个设置) 设置表按公司进行分区,并具有关于用户的索引

我试图让Hibernate生成一个查询,以便在利用分区的同时,通过将公司包括在查询中,惰性地加载用户的设置。目前,正在编写以下Grails代码:

def settings = user.settings
以下(简化)查询的结果:

我希望在调用上面的Grails代码时生成以下查询:

SELECT * FROM SETTINGS WHERE USER_ID=user.id AND COMPANY_ID=company.id
另外,据我所知,在延迟加载集合后,具体的初始化集合将附加到关联对象,并进一步调用该集合,然后从内存中检索集合,而不是运行另一个查询。这一点很重要,因为我将在不同的流程中多次调用user.settings,因此我正在寻找一种解决方案,可以实现同样的效果


是否可以在不对源代码进行任何重大更改的情况下执行此操作?

您可以通过GORM查询获得所需内容。我假设
设置
不属于
用户
,这会使事情变得复杂一些。在这种情况下,最适合的是HQL

def settings = Setting.executeQuery 'select s from User as u inner join u.settings as s inner join s.company as c where u = :user and c = :company', [user: someUser, company: someCompany]
引用用户 如果
设置
确实有对
用户
的反向引用,则可以使用简单的条件或where查询

标准 哪里 HQL 见鬼,这是等效的HQL

def settings = Setting.findAll 'from Setting where user = :user and company = :company', [user: someUser, company: someCompany]

您似乎希望在hibernate查询中附加一个过滤器,在该过滤器中,公司id条件将自动附加


为此,您可以使用grails hibernate过滤器插件。我大约4年前使用过这个插件,现在不知道它是如何工作的

谢谢你的回答。是的,您的设置是正确的,它有一个对用户的反向引用。然而,在我的应用程序中,user.settings会在一个过程中被多次访问,这就变得更复杂了(只是将其添加到编辑中)。我尝试重写访问器以利用更优化的查询,并尝试将结果存储到用户的设置变量中,但效果不太好。碰巧对此有什么想法?如果您正在传递相同的
用户
,并且各种函数正在访问它的
.settings
,那么您可以使用返回缓存设置的
getSettings()
方法创建一个
用户
装饰器。然后传递修改后的
用户
,以避免数据库命中。
def settings = Setting.withCriteria {
    eq 'user', someUser
    eq 'company', someCompany
}
def settings = Setting.where {
    user == someUser
    company == someCompany
}
def settings = Setting.findAll 'from Setting where user = :user and company = :company', [user: someUser, company: someCompany]