查询条件需要语法帮助

时间:2014-08-04 15:43:08

标签: grails

我有这堂课:

class IndividualRecord {
     String citizenship
     static namedQueries = {
        foreignIndividuals {
            not {ilike('citizenship', 'US')}
            fileImportService.matchCountry(citizenship) //returns true if citizenship is a valid country
        }
     }
}

我要做的是建立一个命名查询来识别外国公民。所以,我希望所有不是美国公民的人都来自一个国家,其双字母国家代码与我在数据库中的国家代码集相匹配。后一部分由fileImportService.matchCountry(citizenship)完成,返回一个true,这是我写的另一种方法。

现在,在另一个名为recordSearchService的服务中,我试图在这样的方法中使用这个命名查询:

def individualSearch(Map params) {

    def searchResults = IndividualRecord.withCriteria {
        if (params.foreignCitizen == 'on') //This is a check box on the gsp 
            foreignIndividuals() // call to my named query
    }
}

我收到此错误:

No signature of method: com.twc.fatcaone.RecordSearchService.foreignIndividuals() is applicable for argument types: () values: []. Stacktrace follows:
Message: No signature of method: com.twc.fatcaone.RecordSearchService.foreignIndividuals() is applicable for argument types: () values: []
    Line | Method
->>   20 | doCall                in com.twc.fatcaone.RecordSearchService$_$tt__individualSearch_closure2

我想我需要语法方面的帮助。

2 个答案:

答案 0 :(得分:1)

你有这个:

class IndividualRecord {
    String citizenship
    static namedQueries = {
        foreignIndividuals {
            not {ilike('citizenship', 'US')}
            fileImportService.matchCountry(citizenship)
        }
    }
}

fileImportService.matchCountry(citizenship)的调用不会以您期望的方式影响查询。你可能想要这样的东西:

class IndividualRecord {
    String citizenship
    static namedQueries = {
        foreignIndividuals {
            not {ilike('citizenship', 'US')}
            'in'('citizenship', [ /* some list of codes here */ ])
        }
    }
}

你可以采用的一种方法是接受一个代码列表作为参数:

class IndividualRecord {
    String citizenship
    static namedQueries = {
        foreignIndividuals { List countryCodes ->
            not {ilike('citizenship', 'US')}
            'in'('citizenship', countryCodes)
        }
    }
}

我希望有所帮助。

修改

在第二次阅读原始问题时,我不确定上面的答案是否真的是你想要的,因为现在我认为你想要做的事情是不可能的。看起来你想要的是让你的查询将数据库中的值作为fileImportService.matchCountry方法的参数传递,当然,如果不首先从数据库中检索每个非公民记录并将它们拉回应用程序,这当然不可能发生。您当然可以这样做,但根据您拥有的数据量,这可能是也可能不实际。这可能看起来像这样:

class IndividualRecord {
    String citizenship
    static namedQueries = {
        foreignIndividuals {
            not {
                ilike('citizenship', 'US')
            }
        }
    }
}

然后您可以使用以下内容过滤结果:

def matchingRecords = IndividualRcord.foreignIndividuals.list().findAll {
    fileImportService.matchCountry(it.citizenship)
}

我不确定这是否有帮助,但我希望它有助于澄清可能性。

答案 1 :(得分:0)

未经过测试,但根据grails doc,您可以尝试以下代码段:

if (params.foreignCitizen == 'on')
 def foreigIndiviList = IndividualRecord.foreignIndividuals.list() 

使用Withcriteria只是尝试调用命名查询。