grails - Grails动态查找器能否被应用程序代码破坏?

标签 grails branch gorm dynamic-finders

我正在处理的项目中有一些代码,其中动态查找程序在一个代码分支中的行为与在另一个代码分支中的行为有所不同。

此代码行将返回我的所有广告客户(其中有8个),无论我位于哪个分支。

Advertiser.findAllByOwner(ownerInstance)

但是当我开始添加条件时,事情变得很奇怪。在分支A中,以下代码返回我所有的广告客户:
Advertiser.findAllByOwner(ownerInstance, [max: 25])

但是在分支B中,该代码仅返回1个广告客户。

应用程序代码的更改似乎不可能影响动态查找器的工作方式。我错了吗?还有其他可能导致此功能无效的问题吗?

编辑

我被要求张贴我的类(class)定义。除了发布所有内容之外,我将发布我认为重要的部分:
static mapping = {
    owner fetch: 'join'
    category fetch: 'join'
    subcategory fetch: 'join'
}

static fetchMode = [
      grades: 'eager',
      advertiserKeywords: 'eager',
      advertiserConnections: 'eager'
]

这段代码在分支B中存在,但在分支A中不存在。当我将其拔出时,现在一切正常。

我决定对此代码进行更多的挖掘,以观察我能看到的内容。当我使用withCriteria而不是动态查找器时,我发现了一些有趣的东西:
Advertiser.withCriteria{owner{idEq(ownerInstance.id)}}
我发现这返回了数千个重复项!所以我尝试使用listDistinct:
Adviertiser.createCriteria().listDistinct{owner{idEq(ownerInstance.id)}}
现在,这将返回我的所有8个广告客户,没有重复。但是,如果我尝试限制结果怎么办?
Advertiser.createCriteria().listDistinct{
    owner{idEq(ownerInstance.id)}
    maxResults 25
}

现在,这将返回一个结果,就像我的动态查找器一样。当我将maxResults提升到100K时,现在我得到了全部8个结果。

那是怎么回事?似乎是联接或渴望获取(或两者都有)生成的SQL返回了数千个重复项。默认情况下,Grails动态查找器必须返回不同的结果,因此当我不限制它们时,我没有发现任何奇怪的事情。但是一旦设置了限制,由于记录是按ID排序的,因此前25条记录都是重复记录,这意味着将仅返回一个不同的记录。

至于连接和渴望获取,我不知道代码试图解决什么问题,所以我不能说是否有必要。问题是,为什么在我的类(class)中拥有此代码会产生如此多的重复项?

最佳答案

我发现添加急切的访存(许多级别)是为了加快某些报表的呈现速度,因为正在进行数百个查询。试图渴望按需获取,但是其他开发人员很难使用发现者或Grails标准深入到一个以上的层次。

因此,上述问题的一般答案是:而不是默认情况下的eager,这可能会在其他地方引起巨大的噩梦,我们需要找到一种方法来对单个查询进行渴望获取,该查询可能会在树上进行多个层次的查询。

下一个问题是,如何? Grails对它的支持不是很好,但是只需使用Hibernate的Criteria类就可以实现。这是要点:

        def advertiser = Advertiser.createCriteria()
            .add(Restrictions.eq('id', advertiserId))
            .createCriteria('advertiserConnections', CriteriaSpecification.INNER_JOIN)
                .setFetchMode('serpEntries', FetchMode.JOIN)
                .uniqueResult()

现在,将急切获取广告客户的advertiserConnections,并且也将急切获取advertiserConnections'serpEntries。您可以根据需要走到树下。然后,您可以在默认情况下让类保持懒惰状态-对于hasMany场景,它们绝对应该如此。

关于grails - Grails动态查找器能否被应用程序代码破坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16112062/

相关文章:

Grails:使用 Spring Security 插件进行 Commentable 的用户评估器

grails - 在Grails中获取bean属性名称

grails - 在 Grails 应用程序中何处放置重复任务?

jquery - Grails 中的 Twitter Bootstrap typeahead 示例?

grails - GORM使用基类名称代替具体的类名称创建表

git - 将两个 git 存储库 merge 为一个,保留(重命名)master 分支

svn - 我可以(以及如何)将从主干创建的补丁应用到分支吗?

version-control - 在 Mercurial 分支之间切换

grails - Grails应用程序在域类构建时抛出ConversionNotSupportedException

java - 连接到MS SQL Server时处理uniqueidentifier类型