Gorm条件查询急于获取两个一对多关系,fetchMode不起作用

时间:2019-01-22 13:31:14

标签: join gorm criteria

我有一个域模型-组织中有很多站点,并且有很多域(这是两个“袋”收集属性)。

我想编写一个查询,一次检索一次,最好检索网站和域集合。

我首先尝试了

org = Org.findById (id, [fetch:[sites:"eager", domains:"eager"]]

失败

  

无法同时获取多个文件包:[com.softwood.domain.OrgRoleInstance.sites,com.softwood.domain.OrgRoleInstance.domains]

(仅适用于两个集合之一)。

我尝试了这样的条件查询

    org = resource.withCriteria (uniqueResult: true) {
        fetchMode 'sites', FetchMode.SELECT
        fetchMode 'domains', FetchMode.SELECT
        idEq(id)
        sites {
            org {
                eq 'id', "$id"
            }
        }

    } // didn't work 

哪个错误

  

没有方法签名:com.softwood.controller.OrgRoleInstanceController.fetchMode()适用于参数类型:(java.lang.String,org.hibernate.annotations.FetchMode)值:[sites,SELECT]

这表明它不喜欢fetchMode函数(使用SELECT或JOIN)。

您如何编写标准查询以按ID返回单个匹配的对象,但同时返回网站和域集合?

域类看起来像这样。我不想使用静态映射= {}闭包-因为我想通过根据需要编写显式查询来控制加载

class Org {

    enum OrgRoleType {
        Supplier,
        Customer,
        Service_Provider,
        Manufacturer,
        Maintainer,
        Indeterminate
    }

    String name
    OrgRoleType role
    Collection<NetworkDomain> domains = []
    Collection<Site> sites = []
    Collection<MaintenanceAgreement> mags       //optional only set if role is service provider
    //Collection<Device> ci

     static hasMany = [domains : NetworkDomain, sites: Site, mags:MaintenanceAgreement]

    static mappedBy  = [mags: "maintainer"]  //disambiguate column in mags


    static constraints = {
        name nullable:false
        role  nullable:true
        domains nullable:true
        sites nullable:true
        mags nullable:true  //optional
    }
}

我见过这个[Grails GORM Criteria Query Eager Fetching

我试图做类似的事情,但是fetchMode(字符串,枚举)将不会运行。

更新

我将查询更改为此

    org = resource.withCriteria (uniqueResult: true) {
        join 'sites' 
        join  'domains' 
        idEq(id)
        sites {
            org {
                eq 'id', "$id"
            }
        }
        domains {
            customer {
                eq 'id', "$id"
            }
        }

    }

此错误

Cannot invoke method call() on null object

带有跟踪点,以指向标准中访问站点{org {的位置。

1 个答案:

答案 0 :(得分:0)

因此,第一个测试必须作为集成测试而不是单元测试完成,但是结果是您仍然无法在两个急切的负载下进行查询查找。如果要加载集合,则必须使用条件或where子句进行加载

这里有两个集成测试-第一个使用查找器失败,出现异常,第二个使用条件查询实现目标

void "query by finderById with multiple eager fetch in map conditions " () {

    given :


    when: "we print value from a collection "

    def org = OrgRoleInstance.findById (7L, [fetch:[sites:"eager", domains:"eager"]])
    println org.domains[0].name

    then:
    org.hibernate.loader.MultipleBagFetchException ex = thrown()


}

void "query withCriteria to do  multiple eager fetch in map conditions " () {

    given :


    def org = OrgRoleInstance.withCriteria (uniqueResult: true) {
        fetchMode 'sites', FetchMode.SELECT
        fetchMode 'domains', FetchMode.SELECT
        idEq (7L)
        sites {}
        domains {}

    }


    when: "we print value from a collection "

    println org.domains[0].name

    then:
    org.domains.size() == 1
    org.sites.size() == 2


}