这是在Grails和GORM的背景下
如果域A有很多域B,而域B有一个名为name的字段是字符串,那么生成A列表的最佳方法是什么,该列表已根据其“最佳”值B进行排序。因此,例如,如果A的实例具有名称为“Andrew”和“Zed”的B,那么它应该位于具有名称为“Jim”和“Fred”的B的A之前。
这就是我所拥有的,寻找更多的东西Grails-y:
def apps = B.executeQuery("select distinct c from A as c left join fetch c.bs as b order by b.name",[max:pmax, offset:poffset])
答案 0 :(得分:1)
我通常不直接执行SQL查询,我只是使用GORM来处理它们。
如果您可以将域类设置为双向关联(不支持单向关联),那么您可以执行以下操作:
class classA {
static constraints = {
}
static mapping = {
bList sort :'name', order:'asc'
}
static hasMany = [bList: classB]
}
现在B级:
class ClassB {
static constraints = {
}
static belongsTo = [classAInstance: classA]
String name
}
我将此添加到BootStrap.groovy
文件中以添加一些实例:
class BootStrap {
def init = { servletContext ->
def a = new ClassA()
def b1 = new ClassB(name: 'Andrew')
def b2 = new ClassB(name: 'Lisa')
def b3 = new ClassB(name: 'Walter')
def b4 = new ClassB(name: 'Brandon')
def b5 = new ClassB(name: 'Cathy')
a.addToBList(b1)
a.addToBList(b2)
a.addToBList(b3)
a.addToBList(b4)
a.addToBList(b5)
a.save()
}
def destroy = {
}
}
然后这是我用来测试它的控制器:
class TestController {
def index() {
def aInstance = ClassA.get(1)
def lst = aInstance.bList
lst.each { println it.name }
}
}
您应该可以前往http://localhost:8080/test/test/index
,然后查看stdout打印的位置,然后您就会看到:
Andrew
Brandon
Cathy
Lisa
Walter
可能有一些更好的方法可以做到这一点的某些部分,但这是我能想到的最重要的......