【问题标题】:Grails filter criteria, criteria queries, only explicit items, special scenarioGrails过滤条件、条件查询、仅显式项、特殊场景
【发布时间】:2015-03-28 09:49:18
【问题描述】:

我已经搜索了很多,但我还没有找到解决方案。我想我真的需要你的帮助。我的问题是关于“特殊”目标的过滤。假设我们有几个人,他们有很多技能。我可以按姓名和匹配技能过滤此人。但我需要找到这些人,他们只有一种显式技能,没有其他技能。即可以跑得非常快但仅此而已的人:-)。但是一个人有可能拥有许多技能游泳的条目。即拥有三种技能的彼得:[游泳,游泳,游泳]也应该在结果中。下面是一个例子。我真的很期待听到一些提示。非常感谢。

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

【问题讨论】:

    标签: grails filtering criteria createcriteria


    【解决方案1】:

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

    试试这个:

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

    这应该让你所有的人都拥有一项名为“游泳”的技能。

    【讨论】:

    • 这是一个非常好的开始,谢谢。但是我忘了提到,一个 Persons 应该在有很多游泳条目的结果中。这在这个例子中没有任何意义,但在我的项目中它确实如此。即一个会游泳、游泳、游泳的人也应该在结果中
    • 我用错了sizeEq函数。谢谢你的建议,所以我在上面编辑了我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多