首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态namedQueries

动态namedQueries
EN

Stack Overflow用户
提问于 2013-02-28 06:30:03
回答 2查看 900关注 0票数 1

它们是grails上的动态名称查询吗?我不确定它是否是正确的术语,但是,我指的是一个可以对所有人都适用的名称查询。

类似于:

代码语言:javascript
复制
namedQueries = {
 dynamicQuery{ term, name, value ->
   term(name, value)
 }
}

然后,它可以被称为,也许类似,但不完全是:

代码语言:javascript
复制
def testClass = TestClass.dynamicQuery('eq', 'lastname', 'Bill').list()

所以你也称它为:

代码语言:javascript
复制
def testClass = TestClass.dynamicQuery('gt', 'id', 12).list()

这个可能不起作用,但它们在grails上是否有相似之处?

UPDATE的想法是,这样我就可以把它链接到我想要的多少:

代码语言:javascript
复制
 def testClass = TestClass.dynamicQuery('gt', 'id', 12).dynamicQuery('eq', 'stat', 11).list()

这样我就不必创建许多名称查询了。我希望我能创建一个,并多次使用它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-28 10:35:53

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

下面是一些控制器中的一个示例:

代码语言:javascript
复制
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')
}

会得到你想要的东西。

更新

如果要多次调用此方法,请在列表中传递条件参数,然后执行查询:

代码语言:javascript
复制
    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)
    }
票数 2
EN

Stack Overflow用户

发布于 2013-02-28 07:36:15

在Grails中,您有NamedQueries和Where查询。您提供的示例可以通过使用名称查询并将其放在抽象域类中来实现。域类应该扩展此抽象域。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15128944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档