我试图通过首先建立搜索条件来对数据库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
}
其次,您可能需要查看named queries来封装一些查询定义。这样,您可以根据需要包含/排除它们。例如:
if (predicates.foreign) {
foreignPersons(predicates) // call to named query which contains logic
}
使用此方法,您应该能够构建基于较小定义的非常复杂的查询,从而使它们更可用和可重用。