Grails过滤条件,条件查询,仅显式项,特殊方案

时间:2015-01-29 08:33:04

标签: grails filtering criteria createcriteria

我已经搜索了很多,但我还没有找到解决方案。我想我真的需要你的帮助。我的问题是关于使用"特殊"过滤?目标。让我们说我们有一些人,他们有很多技能。我可以通过名称和匹配技能过滤此人。但我需要得到这些人,他们只有一种探索技能,而不是其他人。即可以跑得非常快但不超过这个的人:-)。但是有可能一个人有许多技能游泳条目。即拥有三项技能的彼得:[游泳,游泳,游泳]也应该在结果中。一个例子如下。我真的很期待听到一些提示。非常感谢你。

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")
        }
    }
}

1 个答案:

答案 0 :(得分:0)

你走在正确的道路上 - sizeEq应该做你想做的事。 你只是以错误的方式使用它。如docs中所述,您可以检查集合的大小。

试试这个:

def results = personCriteria.list(params) {
    and {
        sizeEq("skills", 1)
        skills {
            eq("skillName", "swim")
        }
    }
}

这应该让所有拥有一个技能的人都能得到这个名字' swim'。