Sorting 根据sting列表中的id对对象列表进行排序

Sorting 根据sting列表中的id对对象列表进行排序,sorting,grails,Sorting,Grails,我有一个使用Java7的grails应用程序。在这里,我有一个列表表和一个项目表,如下所示。这是一个多对多关系,其中List是父关系,对于规范化,我有List\u Item类,所以正常功能按预期工作 Class Parent{ static hasOne{list:List} } Class List{ .... static hasMany{item:Item} static hasOne{listOrder:ListOrder} } Class I

我有一个使用Java7的grails应用程序。在这里,我有一个列表表和一个项目表,如下所示。这是一个多对多关系,其中List是父关系,对于规范化,我有List\u Item类,所以正常功能按预期工作

Class Parent{
    static hasOne{list:List}    
}

Class List{
    ....
    static hasMany{item:Item}
    static hasOne{listOrder:ListOrder}
}

Class Item{
    Long id
    .....
}
现在我必须存储列表中项目的顺序。所以我创建了以下结构

Class ListOrder{
    Long id
    List list
    //Stores all the ids as a coma separated string in the necessary order
    String order
}
因此,每次更改订单时,都会更新ListOrder记录

现在,我需要一种在检索列表或父类时使用存储的id对项目进行排序的方法。我希望通过名为“orderItems()”的列表域对象中的一个方法来实现这一点,当我调用此方法时,列表对象中的项参数将设置为排序列表对象

我心中的想法与下面的代码类似

Class List{
    ....
    orderItems(){
        this.item = this.item.sort(this.itemOrder.order.split(','))
    }
    ....
}

我如何才能做到这一点,或者有更好的方法来实现这一点?根据要求,列表可以包含100多个项目,因此我选择不单独存储每个项目位置。

不完全确定您在做什么。但只是把清单排序? 如果列表中的项目是对象,则可以按如下方式对这些对象字段中的任何一个进行排序

   Class obj {
     String name
     String status
     String desc
   }

   List objList = .... List of obj
   obj.sort {a, b -> a.name <=> b.name} // Sort by name
   obj.sort {a, b -> a.status <=> b.status} // Sort by status
   obj.sort {a, b -> a.desc <=> b.desc} // Sort by desc
类obj{
字符串名
字符串状态
字符串描述
}
列表对象列表=。。。。obj列表
obj.sort{a,b->a.name b.name}//按名称排序
obj.sort{a,b->a.status b.status}//按状态排序
obj.sort{a,b->a.desc b.desc}//按desc排序

列表可以存储数百万项,所以不要创建字符串。

不完全确定您在做什么。但只是把清单排序? 如果列表中的项目是对象,则可以按如下方式对这些对象字段中的任何一个进行排序

   Class obj {
     String name
     String status
     String desc
   }

   List objList = .... List of obj
   obj.sort {a, b -> a.name <=> b.name} // Sort by name
   obj.sort {a, b -> a.status <=> b.status} // Sort by status
   obj.sort {a, b -> a.desc <=> b.desc} // Sort by desc
类obj{
字符串名
字符串状态
字符串描述
}
列表对象列表=。。。。obj列表
obj.sort{a,b->a.name b.name}//按名称排序
obj.sort{a,b->a.status b.status}//按状态排序
obj.sort{a,b->a.desc b.desc}//按desc排序

列表可以存储数以百万计的项目,所以不要创建字符串。

我已经读过几遍了,我认为我理解最终用户想要实现的目标,并且认为这是他们试图管理有限的hasMany关系的某种自定义方式

这个过程有缺陷,我会解释原因

通过使用名为ids的字符串字段,该字段包含ID列表。您将只能真正地对列表进行排序,而不需要通过ID进行复杂的查询。一旦分开分类等,这是一种业余的关系思维方式

这就是为什么必须首先查找第一个对象。然后,一旦通过自己的流程得到迭代,就可以为应该映射的ID加载实际记录。这意味着在本例中,编写一个无缝工作的查询来查找挂起的特定给定关系将非常困难

而不是做你所有的这些

Class Example1 {
   //Would have 
  // static hasMany = [ example2:Example2]
  //but in your case
   String examples2=1,2,10000001122,33222222332222,023222434343243, 
   //and so on
}
所以你有两个选择

Class Example1 {
   //Would have 
   static hasMany = [ example2:Example2]
   static constrains= {
     example2:validator: checkExample
    }
  static def checkExample={val,obj,errors->
        if (val && val.size()>100) {
            errors.rejectValue('', "toomany.records", [''] as Object[], '')
        }
    }
}
以上将限制为100 hasMany,并允许您从主对象或反向对象进行无缝查询访问,前提是belongsTo已正确设置为反向

或者,如果你这样想的话,这是非常直接的:

class Example1 {
  //nothing at all about example2 as yet


    Set<Example2> getExample2BySortedGivenField() {
       //either a set or a list that then you write your HQL 
       // or some specific query to return object by given sorting
        return Example2.findAllByExample(this)

    }

   //you can have a few different onces if needed or a dynamic method that passes in what to sort by - the output will be what you have asked for in question

}

我已经读过几遍了,我认为我理解最终用户想要实现的目标,并且认为这是他们试图管理有限的hasMany关系的某种定制方式

这个过程有缺陷,我会解释原因

通过使用名为ids的字符串字段,该字段包含ID列表。您将只能真正地对列表进行排序,而不需要通过ID进行复杂的查询。一旦分开分类等,这是一种业余的关系思维方式

这就是为什么必须首先查找第一个对象。然后,一旦通过自己的流程得到迭代,就可以为应该映射的ID加载实际记录。这意味着在本例中,编写一个无缝工作的查询来查找挂起的特定给定关系将非常困难

而不是做你所有的这些

Class Example1 {
   //Would have 
  // static hasMany = [ example2:Example2]
  //but in your case
   String examples2=1,2,10000001122,33222222332222,023222434343243, 
   //and so on
}
所以你有两个选择

Class Example1 {
   //Would have 
   static hasMany = [ example2:Example2]
   static constrains= {
     example2:validator: checkExample
    }
  static def checkExample={val,obj,errors->
        if (val && val.size()>100) {
            errors.rejectValue('', "toomany.records", [''] as Object[], '')
        }
    }
}
以上将限制为100 hasMany,并允许您从主对象或反向对象进行无缝查询访问,前提是belongsTo已正确设置为反向

或者,如果你这样想的话,这是非常直接的:

class Example1 {
  //nothing at all about example2 as yet


    Set<Example2> getExample2BySortedGivenField() {
       //either a set or a list that then you write your HQL 
       // or some specific query to return object by given sorting
        return Example2.findAllByExample(this)

    }

   //you can have a few different onces if needed or a dynamic method that passes in what to sort by - the output will be what you have asked for in question

}

为什么所有的obj.sort迭代?为什么不
obj.sort{a,b->a.name b.name?:a.status b.status?:a.desc b.desc}
做同样的事情而不反复调用它,为什么所有的obj.sort迭代都是这样?为什么不
obj.sort{a,b->a.name b.name?:a.status b.status?:a.desc b.desc}
做同样的事情,而不反复调用它呢