1

それらはgrails上の動的な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()

これは、多くの名前付きクエリを作成する必要がないようにするためです。私はそれを作成して複数回使用できることを望んでいました。

4

2 に答える 2

2

Grails のcreateCriteriaメソッドは、Grails HibernateCriteriaBuilderインスタンスを生成します。このインスタンス内で、invokeMethodメソッドを呼び出してクエリ基準を動的に作成できます。これは通常、標準 DSL によって定義されます。

いくつかのコントローラーの例を次に示します。

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)
    }
于 2013-02-28T10:35:53.120 に答える
0

Grailsには、NamedQueriesとWhereQueriesがあります。与えた例は、namedqueriesを使用し、これを抽象ドメインクラスに配置することで実装できる可能性があります。ドメインクラスは、この抽象ドメインを拡張する必要があります。

于 2013-02-28T07:36:15.757 に答える