IT序号网

grails之动态namedQueries

qlqwjy 2025年12月25日 编程语言 111 0

他们在grails上是动态的namedQuery吗?我不确定它是否正确,但是,我的意思是对所有人都适用的namedquery。

就像是:

namedQueries = { 
 dynamicQuery{ term, name, value -> 
   term(name, value) 
 } 
} 

然后可以将其称为,但不完全是:
def testClass = TestClass.dynamicQuery('eq', 'lastname', 'Bill').list() 

所以您也这样称呼它:
def testClass = TestClass.dynamicQuery('gt', 'id', 12).list() 

这可能不起作用,但是它们的用法相似吗?

更新
我的想法是,因此我可以根据需要随意链接它:
 def testClass = TestClass.dynamicQuery('gt', 'id', 12).dynamicQuery('eq', 'stat', 11).list() 

这样一来,我不必创建许多命名查询。我希望可以创建一个并多次使用。

请您参考如下方法:

Grails的createCriteria方法生成Grails的HibernateCriteriaBuilder实例,您可以在其中调用invokeMethod方法来动态创建查询条件,该条件通常由标准DSL定义。

这是一些 Controller 中的示例:

private String dynamicCriteriaTest(String term, name,  value) { 
    def c = TestClass.createCriteria() 
    def param = [] 
    param << name 
    param << value 
    def result =  c.list{ 
        c.invokeMethod(term, param as Object[]) 
    } 
    return result.toString() 
}  
 
def test() { 
    render dynamicCriteriaTest('eq','lastname','Bill') 
} 

那会得到你想要的东西。

更新

如果要多次调用此方法,请在List中传递条件参数,然后执行查询:
    private List dynamicCriteriaTest(List param) { 
        def c = TestClass.createCriteria() 
        def paramList = param.collate(3)    //split the parameters into groups 
        def result =  c.list{ 
            paramList.each { paramInstance -> 
                def command = paramInstance[0] 
                paramInstance.remove(0) 
                c.invokeMethod(command, paramInstance as Object[]) 
            } 
        } 
        return result 
    } 
 
    def test() { 
        ArrayList param = new ArrayList() 
            //the 1st criteria 
        param << 'gt' 
        param << 'id' 
        param << (long)12    //you have to check the Grails [HibernateCriteriaBuilder] API to make sure the parameter passed to `invokeMethod` is in the right type (e.g. **long** in this case) 
 
            //the 2nd one 
        param << 'eq' 
        param << 'stat' 
        param << (long)11 
 
            //even more 
        param << 'like' 
        param << 'description' 
        param << 'some text%'     
 
        render dynamicCriteriaTest(param) 
    } 


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!