在列表中查找具有值的所有对象

时间:2014-02-25 09:02:31

标签: grails gorm

我将自己介绍给Grails环境(它是 awesome )。我一直在收获findAllBy*范围等动态生成方法的好处。但是,我遇到了一个问题,我不确定如何继续。花在Google上的一个小时对我来说也没有那么多。

问题

我有一个如下课程:

class Runner {

    static hasMany = [owners: Owner]
}

在我的所有者控制器中,我希望找到包含给定Runner的所有Owner个对象。实际上,我正试图从many转到one

示例

如果我有一个Owner对象,看起来像

Owner[name="Dave"]

我有一个Runner,其中包含:

Runner[owners[Owner[name="Dave"], Owner[name="James"]]]

我的查询应返回此Runner对象,但不应返回

Runner[owners[Owner[name="Bill"], Owner[name="James"]]]

我的尝试

我试图使用inList扩展名,但经过一些进一步的研究后,我意识到这是为了反过来而设计的。我的代码目前如下:

def runners() {
    log.info("Runners")
    List<Runner> runners;
    Owner owner;

    if (params.id) {
        log.info("Id = " + params.id);
        owner = Owner.get(params.id);
        log.info("owner = " + owner.name);
        // Grab runners in list thing.
        log.info("Number of results = " + runners.size());
    }


    [results: results, jockeyInstance: jockey]
}

3 个答案:

答案 0 :(得分:3)

经过对HQL的一些研究,我找到了一个更优雅的解决方案,根本不需要我更改Domain类。我使用的查询如下:

runners = Runner.executeQuery("FROM Runner as r WHERE :owner in elements(r.owners)", [owner : ownerInstance]);

其中ownerInstance是用于映射到Owner的{​​{1}}对象。

答案 1 :(得分:1)

也许不是手头问题的答案,但你也可以让业主知道这样的跑步者

    class Runner {
            String name
            static hasMany = [ owners: Owner ]
            static belongsTo = Owner
    }


    class Owner {
            String name
            static hasMany = [ runners: Runner ]
    }

    Owner o1 = new Owner(name: "O1").save()
    Owner o2 = new Owner(name: "O2").save()
    Owner o3 = new Owner(name: "O3").save()
    new Runner(name: "R1").with{
            addToOwners(o1)
            addToOwners(o2)
            save()
    }
    new Runner(name: "R2").with{
            addToOwners(o1)
            addToOwners(o3)
            save()
    }
    print o3.runners

结果为[runnerowner.Runner : 2]

答案 2 :(得分:0)

这是你期待的吗?

def results = Runner.withCriteria {
    owners {
        eq 'name', 'Dave'
        //idEq params.id //If id of owner is provided
    }
}

假设你有

class Runner {
    static hasMany = [owners: Owner]
}

class Owner {
    String name
}

以下是您可以尝试的sample