我将自己介绍给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]
}
答案 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。