2013-02-28 32 views
1

他們是在grails上動態的namedquery嗎?我不確定它是否是正確的術語,但是,我的意思是一個可以對所有人都忠實的命名查詢。動態namedQueries

喜歡的東西:

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

然後,它可以被稱爲也許像但不完全:

def testClass = TestClass.dynamicQuery('eq', 'lastname', 'Bill').list() 

,所以你把它太像:

def testClass = TestClass.dynamicQuery('gt', 'id', 12).list() 

這一條可能不工作,但是他們在Grails中類似嗎?

UPDATE 的想法是,這樣我就可以鏈接它多達我想這樣的:

def testClass = TestClass.dynamicQuery('gt', 'id', 12).dynamicQuery('eq', 'stat', 11).list() 

這是這樣,我沒有創造出許多namedqueries。我希望能夠創建一個並多次使用它。

回答

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') 
} 

,將讓你想要的東西。


更新

如果要多次調用該方法,在一個列表傳遞的標準參數,然後執行查詢:

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) 
    } 
+0

謝謝您的回答金釗,您能再次看到這個問題嗎?我更新了它。 – noob 2013-02-28 13:20:04

+0

@ user1816978,看我的更新。 – coderLMN 2013-02-28 15:42:10

0

在Grails中,您有NamedQueries和Where Queries。您提供的示例可以通過使用namedqueries並將其放置在抽象域類中來實現。你的域類應該擴展這個抽象域。

+0

謝謝您的回答馬可,你能看到我的問題的更新嗎? – noob 2013-02-28 13:22:39