Grails 建立一个搜索条件很难吗?

Grails 建立一个搜索条件很难吗?,grails,groovy,gorm,Grails,Groovy,Gorm,我试图通过首先构建搜索条件来搜索我的数据库IndividualRecords,但它的语法对于某些值来说有点棘手。为一个确切的字段设置条件很容易,比如如果firstName字段中有“John”,我会在我的条件中添加这个谓词: IndividualRecord.withCriteria { if (predicates.firstName != null) { eq 'firstName', predicates.firstName } } 但如果他们还说他们想搜索美

我试图通过首先构建搜索条件来搜索我的数据库IndividualRecords,但它的语法对于某些值来说有点棘手。为一个确切的字段设置条件很容易,比如如果firstName字段中有“John”,我会在我的条件中添加这个谓词:

IndividualRecord.withCriteria {

    if (predicates.firstName != null) {
      eq 'firstName', predicates.firstName
    }
}
但如果他们还说他们想搜索美国公民,我不能这么做

if (predicates.UScitizenship) {
      eq 'citizenship', predicates.citizenship
    }
因为我想查找基于公民身份“我们”、“我们”、“我们”和“我们”的记录(必须考虑到案件不敏感),所以我该如何解决这个问题

这才是真正有趣的开始。说我只想找到外国公民。我有一个低级mongodb api方法,它通过返回true告诉我公民身份是否有效,如果它在我拥有的国家代码数据库中找到它,那么我想我可以构建另一个谓词,比如伪代码:

if (predicates.foreign) {
      all such people whose !citizenship.caseIgnoreEquals('US') && matchCountry(it.citizenship)
}
这意味着所有这些公民身份不是“我们”且与我的国家代码列表匹配的人,其中
matchCountry(String countryCode)
是我验证国家代码的低级api方法,如果是有效的国家代码,将返回true


我发现很难定义如此复杂的谓词语法,这就是我需要帮助的地方。谢谢。

这里有两个问题

首先,可以使用ilike而不是equals来解决区分大小写和不区分大小写的问题。例如:

if (predicates.firstName != null) {
  ilike 'firstName', predicates.firstName
}
if (predicates.foreign) {
  foreignPersons(predicates) // call to named query which contains logic
}
其次,您可能希望查看如何封装一些查询定义。这样,您可以根据自己的需要包括/排除它们。例如:

if (predicates.firstName != null) {
  ilike 'firstName', predicates.firstName
}
if (predicates.foreign) {
  foreignPersons(predicates) // call to named query which contains logic
}

使用此工具,您应该能够构造基于较小定义的非常复杂的查询,从而使它们更易于使用和重用。

命名查询听起来是一个不错的工具,但我仍然不知道如何编写外部查询的语法。在IndividualRecord类中放置一个命名查询似乎是递归的,该类的内容为:foreignPersons{IndividualRecord,这样他们的公民身份属性(一个字符串)就不同于'US',并且根据my matchCountry(It.civilization)函数返回'true',它是数据库中的一个有效国家。这个语法正是我需要帮助的地方。只是在这里编我自己的语法:
class IndividualRecord{String citizensity static namedquerys={foreignIndividuals{inotlike'citizensity',US'isTrue,matchCountry(citizensity)}}
对不起,我不知道如何在注释中键入格式正确的代码,但这就是我需要的语法要点。此外,matchCountry是我在服务中定义的一个方法,所以在静态命名查询定义中允许它吗?