我是新手,遇到了问题。我有一个方法,该方法接收一些数据并将数据与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/

10-10 17:29