我已经搜索了很多,但我还没有找到解决方案。我想我真的需要你的帮助。我的问题是关于使用"特殊"目标进行过滤。假设我们有几个人,他们有很多技能。我能够按姓名和匹配技能过滤此人员。但我需要得到这些人,他们只有一项明确的技能,没有其他技能。即可以跑得很快的人,但仅此而已:-)。但是一个人可能有很多技能游泳的条目。即彼得有三个技能:[游泳,游泳,游泳]也应该在结果中。下面是一个示例。我真的很期待听到一些提示。谢谢。
class Person {
String name;
static hasMany = [skills: Skill]
}
class Skill {
Double skillLevel;
SkillType skillName;
}
class ControllerClass {
def filterMethod() {
def personCriteria = Person.createCriteria()
results = personCriteria.list(params) {
and {
eq("name", "Peter")
//I can do this to get Person, who have the skill to swim
skills {
eq("skillName", "swim")
}
//Problem: this Person might have other skills, too. i.e. "run fast", "jump high", "Math"
//My Goal is: I want only these persons, who only have the skill "swim" and no other skill, but the item swim can appear more than once
}
}
}
}
在我的场景中,我知道所有不同类型的技能,所以它们是有限的。这会让它变得更容易,不是吗?让我们假设有三种可能的技能:游泳,跑步,唱歌。但它们可以出现不止一次。为什么这样的东西不起作用?
and {
and {
sizeGe("skills", 1)
skills{
eq("skillName", "swim")
}
}
and {
sizeEq("skills", 0)
skills {
eq("skillName", "run")
}
}
and {
sizeEq("subgruppen", 0)
skills {
eq("skillName", "sing")
}
}
}
你走在正确的道路上——sizeEq
应该做你想做的事。你只是用错了方式。如文档中所述,您可以检查集合的大小。
试试这个:
def results = personCriteria.list(params) {
and {
sizeEq("skills", 1)
skills {
eq("skillName", "swim")
}
}
}
这应该让你们所有拥有一项技能的人都以"游泳"为名。