【问题标题】:Find all objects with value in list在列表中查找所有具有值的对象
【发布时间】:2014-02-25 09:02:31
【问题描述】:

我正在向自己介绍 Grails 环境(它真棒)。我一直受益于动态生成的方法,如findAllBy* 范围。但是,我遇到了一个问题,我不确定如何进行。在 Google 上花一个小时对我来说也没有什么收获。

问题

我有一个类似如下的课程:

class Runner {

    static hasMany = [owners: Owner]
}

在我的 Owner 控制器中,我希望找到所有包含给定 OwnerRunner 对象。实际上,我正在尝试从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]
}

【问题讨论】:

标签: grails grails-orm


【解决方案1】:

在对HQL 进行一些研究后,我发现了一个更优雅的解决方案,根本不需要我更改Domain 类。我使用的查询如下:

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

其中ownerInstance 是用于映射到RunnerOwner 对象。

【讨论】:

  • 我用我的答案中的代码进行了尝试,它的工作原理与宣传的一样。这应该被认为是答案。
【解决方案2】:

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

    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

结果为@​​987654322@

【讨论】:

  • 这绝对是一个选项,所以+1。
【解决方案3】:

这是你所期待的吗?

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,你可以试试。

【讨论】:

    猜你喜欢
    • 2018-08-05
    • 2012-07-13
    • 2019-09-14
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多