它们是grails上的动态名称查询吗?我不确定它是否是正确的术语,但是,我指的是一个可以对所有人都适用的名称查询。
类似于:
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()这样我就不必创建许多名称查询了。我希望我能创建一个,并多次使用它。
发布于 2013-02-28 10:35:53
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)
}发布于 2013-02-28 07:36:15
在Grails中,您有NamedQueries和Where查询。您提供的示例可以通过使用名称查询并将其放在抽象域类中来实现。域类应该扩展此抽象域。
https://stackoverflow.com/questions/15128944
复制相似问题