Grails 基于自定义域类方法对对象进行排序

Grails 基于自定义域类方法对对象进行排序,grails,gorm,Grails,Gorm,我有一个域类,在这个类中我定义了一些方法,这些方法根据不同的算法(例如流行度)给对象打分 现在,我想检索这些对象的列表,这些对象按其中一个分数排序(例如,按人气分数递减) 有办法对付戈姆吗 示例类: class SomeObject { String title Integer popularity() { //some algorithm return popularity } } 我可以想出三种解决办法。假设您的数据集很小,您可以返

我有一个域类,在这个类中我定义了一些方法,这些方法根据不同的算法(例如流行度)给对象打分

现在,我想检索这些对象的列表,这些对象按其中一个分数排序(例如,按人气分数递减)

有办法对付戈姆吗

示例类:

class SomeObject {
    String title

    Integer popularity() {
        //some algorithm
        return popularity
    }
}

我可以想出三种解决办法。假设您的数据集很小,您可以返回整个列表,然后对其进行排序。 比如说

objectList.sort{popularity()}
注意基于以下链接

如果计算公式很简单,则始终可以使用HQL查询,而不是默认的find by方法。HQL是一种类似于SQL的查询语言,它可以在Hibernate对象上工作,而Gorm就是基于这种对象构建的。有关更多信息,请参阅以下链接。 如果不需要实时更新计算字段,并且HQL的计算非常复杂,则可以安排作业每小时左右更新一次计算结果,然后将生成的结果存储在域类的字段中。有关Grails作业调度的更多信息,请参见以下链接。
贾里德,你是对的。因为它是一个计算值,没有存储在数据库中,所以GORM无法知道任何关于它的信息。如果你按照你说的做,为值创建一个新列,然后根据需要更新它,你可以使用
SomeObject.list(order:'desc',sort:'popularity',max:10)
语法。

嘿,Jared,实际上这类语法间接地回答了我的问题。这种方法可以正确地对对象列表进行排序,但要显示前十个对象,必须先提取所有记录,然后进行排序,这对性能有明显的影响。流行度应该有自己的专栏,并且应该在算法因素改变时更新。我认为这是在DB级别通过受欢迎程度限制查询的唯一方法。这是一个非常方便的提示,谢谢!用多种方法更新我的答案,更新流行度或动态计算流行度。