2009-11-12 3 views
0

У меня есть класс домена, в котором я определил некоторые методы, которые дают объекту оценку на основе разных алгоритмов (например, популярность).Сортировка объектов на основе методов пользовательского класса домена

Теперь я хочу получить список этих объектов, отсортированных по одному из этих баллов (например, по убыванию по популярности).

Есть ли способ общения с GORM?

Пример Класс:

class SomeObject { 
    String title 

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

Обновлен мой ответ несколькими способами обновления популярности или расчета его на лету. – Jared

ответ

0

Jared и вы правы. Поскольку это вычисленное значение и не хранится в БД, GORM не знает ничего об этом. Если вы сделаете так, как вы говорите, и создайте новый столбец для значения, а затем обновите его по мере необходимости, вы можете использовать синтаксис SomeObject.list(order:'desc', sort: 'popularity', max:10).

0

Есть три решения я могу думать. Предполагая, что ваш набор данных невелик, вы можете просто вернуть весь список, а затем отсортировать его. Например

objectList.sort{popularity()} 

Примечание построена на ссылку. http://jlorenzen.blogspot.com/2008/05/groovy-sort-list.html

Если формула расчета проста, вы всегда можете использовать запрос HQL вместо методов поиска по умолчанию. HQL - это язык запросов, похожий на SQL, который работает на объектах Hibernate, на которых строится Gorm. Для получения дополнительной информации см. Следующую ссылку. http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html Если вам не нужно вычислять поле, которое нужно обновить в режиме реального времени, и ваши вычисления сложны для HQL, вы можете запланировать задание для обновления результатов расчета каждый час или около того, а затем сохранить сгенерированный результат в поле вашего класса домена. Для получения дополнительной информации о планировании работы Grails см. Следующую ссылку. http://grails.org/Job+Scheduling+%28Quartz%29

+1

Эй, Джаред, на самом деле этот вопрос косвенно отвечает на мой вопрос. Этот метод правильно сортирует список объектов, но для отображения десяти лучших объектов вам придется вытащить все записи, а затем сортировать, что имеет очевидные последствия для производительности. Популярность должна иметь собственный столбец и должна обновляться при изменении алгоритмических факторов. Я думаю, что это единственный способ ограничить запрос популярностью на уровне БД. Это очень удобный отзыв, хотя, спасибо! – Thody