List grails:使用findAllBy时保持列表顺序

List grails:使用findAllBy时保持列表顺序,list,grails,findall,List,Grails,Findall,我想保持我第一份名单的顺序 def myList = [444,1111,33333,22222] 但是当我使用findAllBy时,顺序就改变了 def myList2 = myDomain.findAllByRmIdInList(myList) =>输出:[11112222233333444] 是否有一种默认情况下取消激活订单的方法 谢谢您应该使用 def myList2 = MyDomain.findAllByRmIdInList(myList, [sort:"pmId"]) 如果您

我想保持我第一份名单的顺序

def myList = [444,1111,33333,22222]
但是当我使用findAllBy时,顺序就改变了

def myList2 = myDomain.findAllByRmIdInList(myList)
=>输出:[11112222233333444]

是否有一种默认情况下取消激活订单的方法

谢谢

您应该使用

def myList2 = MyDomain.findAllByRmIdInList(myList, [sort:"pmId"])
如果您愿意,您也可以通过desc或asc传递订单


注意:查找程序在域上工作,而不是在控制器上。

如果您想保持列表的顺序,可以使用动态查找程序“getAll”,如下所示

检索指定域的域类实例列表 ID,按原始ID列表排序。如果提供的某些ID是 null或没有具有这些ID的实例,结果列表将 在这些位置有空值

因此,您可以尝试下一个代码:

def myList2 = myDomain.getAll(myList)
评论后更新

您可以使用比较器来实现这一点。这是一个有点棘手,但它应该工作。下面是一个例子:

def myList = [444,1111,33333,22222]
def mc = [compare: { a,b -> a.rmId == b.rmId ? 0 : myList.indexOf(a.rmId) < myList.indexOf(b.rmId) ? -1 : 1 } ] as Comparator
def myList2 = myDomain.findAllByRmIdInList(myList)
def results = myList2.sort(mc) 

results.each() {
    log.info(it.rmId)
}

希望这能有所帮助。

我添加了[sort:prop],但我有以下错误:无法解析属性:prop of:app.myDomain。请写下要排序的域属性以代替prop。正如我写的,我不想排序,我想保持第一个列表的顺序。也许我的问题不清楚…你是否已经覆盖了你的toString?域中的toString?是的,我有。按照文档中的规定,我需要ID,但我没有。我可以一个接一个地获取我所有元素的ID,但我想避免在没有选择的情况下这样做。嗨,Jils。对于第一个答案,很抱歉,我没有在动态查找器中看到“id”之前的“rm”。我刚刚用比较器更新了我的答案。它应该有用。谢谢它的工作。我能解释一下你的第二条线路吗?不客气。第二行是比较器。这是一个新的规则来排序你的名单“a”和“b”是findAll的两个元素,因此它们属于“myDomain”。如果a.rmId==b.rmId,那么我假设a==b->0。如果a.rmId在myList中的位置低于b.rmId在myList中的位置,则在结果->-1中,“a”必须出现在“b”之前。如果a.rmId在myList中的位置大于b.rmId在myList中的位置,则“a”将出现在“b”->1之后。