我有这堂课:
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
我想我需要语法方面的帮助。
答案 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只是尝试调用命名查询。