我是新手,遇到了问题。我有一个方法,该方法接收一些数据并将数据与createCriteria匹配并返回数据。它工作正常,但是如果要与方法中的五个参数匹配,并且如果match返回数据,则我现在想做;如果与五个参数不匹配,请尝试如果与四个参数匹配并返回数据,如果与四个参数不匹配,请尝试与三个参数匹配并返回数据...。
但不是很确定如何将所有这些放入if语句中并返回我的result.dataPerson,或者也许我必须找到另一种方法。
我的方法:
def getPersonData(String name, String surname, String address, String phone){
def searchdataPerson = ClientConfig.createCriteria()
def result = searchdataPerson.get{
and{
or{
eq('surname', surname)
isNull('surname')
}
or{
eq('address', address)
isNull('address')
}
or{
eq('phone', phone)
isNull('phone')
}
or{
eq('name', name)
isNull('name')
}
}
maxResults(1)
}
return result.dataPerson
}
我正在尝试做这样的事情,但它不起作用
def searchdataPerson = ClientConfig.createCriteria()
def result = searchdataPerson .get{
if(eq('name', name) && eq('surname', surname) && eq('address', address) && eq('phone', phone)){
}else if(eq('name', name) && eq('surname', surname) && eq('address', address)){
}
maxResults(1)
}
return result.dataPerson
我收到此错误:
java.lang.NullPointerException: Cannot get property 'dataPerson' on null object
最佳答案
正如Jeff在上面指出的那样,您应该真正地引用结果,并且由于出现结果而收到错误,但是尝试返回一个实体或可能使结果挂起的事件对象。
什么是dataPerson?它与ClientConfig的关系是否悬而未决,即ClientConfig中的includesTo或hasMany声明?
从以上所有内容还不清楚,但是尝试以另一种方式解释它,您可以使用HQL:
String query="""
select new map(c.name as name,c.surname as surname, d as dataPerson)
from ClientConfig c
left join c.dataPerson d where
(c.surname != 'GooglyMoogly' or c.surame is null or c.surname=:surname) and
(c.address != 'Caddyshack' or c.address is null or c.address=:address) and
(c.phone is null or c.phone=:phone) and
(c.name is null or c.name=:name) and
"""
def inputParams=[surname:surname,address:address,phone:phone,name:name]
def result = ClientConfig.executeQuery(query,inputParams,[readOnly:true,timeout:15,max:1])
result?.each { output ->
println "--- ${output?.name} ???? ${output.surname} ???? "
output?.dataPerson.each { dp ->
println "--- ${dp.name} ???? "
}
}
上面的某些内容可能不正确,但可以帮助您理解所要实现的目标。
在上面的HQL语句中,我在clientConfig和dataPerson之间进行了左连接。这是假设
class ClientConfig {
static hasMany= [dataPerson:DataPerson]
}
左联接意味着即使dataPerson不存在,它也会尝试联接(null对象)
当我只想迭代一下dataPerson的各个方面时,那么
result?.each { output ->
// if hasMany
println "${output.dataPerson[0].name}"
// if a belongsTo or a direct relation:
println "${output.dataPerson.name}"
}
并且,如果您要定义自己希望在HQL中收集的实际元素,则无需执行任何操作,则最终迭代将仅包含您确切要求的内容,因此无需向前遍历该类。
String query="""
select new map(d.name as name,d.surname as surname, d.address as address)
from ClientConfig c
...
现在,这里有了对象,无需从result扩展到result.dataSet ...:
result?.each { output ->
println " $output.name $output.surname $output.address "
}
关于grails - 如何在grails中将if语句放入createCriteria中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35700637/