建立一个棘手的搜索条件?

时间:2014-08-03 17:29:36

标签: grails groovy gorm

我正在尝试通过首先构建搜索条件来搜索我的数据库IndividualRecords,但其语法对于某些值来说有点棘手。很容易为精确字段设置标准,例如firstName字段具有' John'在其中我会将此谓词放在我的标准中:

IndividualRecord.withCriteria {

    if (predicates.firstName != null) {
      eq 'firstName', predicates.firstName
    }
}

但如果他们还补充说他们想要搜索美国公民,我就不能这样做,

if (predicates.UScitizenship) {
      eq 'citizenship', predicates.citizenship
    }

因为我想查找基于公民身份的记录'美国'我们' uS' uS'我们'(必须考虑不区分大小写的情况)所以我该如何解决这个问题?

然后这里真正有趣的开始。说我想找到外国公民。我确实有一个低级别的mongodb api方法告诉我,如果公民身份是有效的,如果它在我拥有的国家代码数据库中找到它,那么我想我可以构建另一个类似伪代码的谓词:

if (predicates.foreign) {
      all such people whose !citizenship.caseIgnoreEquals('US') && matchCountry(it.citizenship)
}

意味着所有这些人的公民身份都不是美国人的'并匹配我所拥有的国家/地区代码列表matchCountry(String countryCode)是用于验证国家/地区代码的低级api方法,如果是有效的国家/地区代码,则会返回true。

我发现很难定义这样复杂的谓词'语法,这是我需要一些帮助的地方。感谢。

1 个答案:

答案 0 :(得分:1)

这里有两个问题。

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

if (predicates.firstName != null) {
  ilike 'firstName', predicates.firstName
}

其次,您可能希望查看named queries来封装您的一些查询定义。这样您就可以根据需要包含/排除它们。例如:

if (predicates.foreign) {
  foreignPersons(predicates) // call to named query which contains logic
}

使用它,您应该能够构建非常复杂的查询,这些查询构建在较小的定义之上,从而使它们更具可用性和可重用性。

相关问题