2015-01-29 2 views
0

이미 많이 검색했지만 해결 방법을 찾지 못했습니다. 나는 너의 도움이 정말로 필요하다고 생각한다. 내 문제는 "특별한"목표로 필터링하는 것입니다. 우리가 많은 기술을 가지고있는 소수의 사람을 가지고 있다고 가정 해 봅시다. 나는이 사람을 이름과 일치하는 기술로 걸러 낼 수있다. 그러나 나는 단 한 번의 폭발 기술과 다른 기술을 가진 사람들을 입수해야합니다. 즉 매우 빠르게 실행할 수 있지만 이보다 더 좋은 것은 아닙니다. 그러나 사람이 기술의 많은 항목을 수영했을 수도 있습니다. 즉 세 가지 기술을 가진 피터 : [수영, 수영, 수영]도 결과에 있어야합니다. 예를 들면 다음과 같습니다. 나는 정말로 약간의 팁을 듣기를 고대하고있다. 고맙습니다.Grails 필터 기준, 조건 쿼리, 명시 적 항목 만, 특별 시나리오

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

} 

필자의 시나리오에서는 모든 종류의 기술을 알고 있으므로 제한적입니다. 이렇게하면 더 쉽게 만들 수 있지 않을까요? 수영, 달리기, 노래하기 등 세 가지 기술이 있다고 가정 해 봅시다. 그러나 그들은 한 번 이상 나타날 수 있습니다. 무엇 당신 whant을해야 sizeEq - 왜 이런 일이? 당신은 옳은 길이다

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

답변

0

작동하지 않습니다 않습니다. 방금 ​​잘못 사용했습니다. docs에 설명 된대로 컬렉션의 크기를 확인할 수 있습니다.

이 시도 :

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

이 당신에게 이름이 '수영'과 정확히 하나 개의 기술을 가지고 모든 사람을 얻어야한다.

+0

이것은 정말 좋은 시작입니다. 감사합니다. 그러나 많은 수영 선수가있는 인물이 결과에 있어야한다고 언급하는 것을 잊었습니다. 이 예제에서는 아무 의미가 없지만 내 프로젝트에서는 그렇습니다. 즉 수영, 수영, 수영을 한 사람도 결과에 있어야합니다. – waywayway

+0

나는 sizeEq 함수를 잘못된 방법으로 사용했습니다. 귀하의 조언을 주셔서 감사합니다, 그래서 위의 내 질문을 편집했습니다. – waywayway