Проекция в Грааль - PullRequest
1 голос
/ 17 марта 2011

Не могли бы вы сказать мне, как сделать проекцию для класса домена Grails ?!В моем случае я хочу получить список (например) имени пользователя по его идентификатору.В моем методе это означает, что я передаю список userId и получаю список имен пользователей.Поддерживают ли динамические методы домена Groovy эту функцию?В настоящее время я использую свою функцию ниже:

public String getUserNamesByIds(String[] ids) {
    StringBuffer names = User.get(Integer.parseInt(ids[0]).getName())
    if(ids.length > 1) {
        (1..ids.length - 1).each{
             names.append(", " + User.get(Integer.parseInt(ids[it])).getName())
        }
    }
    return names.toString()
}

Как видите, я просто хочу получить имя (и построить общую строку).Я думаю, что это нехорошо, потому что мне нужно сделать много маленьких шагов и выполнить много запросов к базе данных, чтобы получить объект User.Есть ли лучший способ сделать это?Большое вам спасибо!

Ответы [ 2 ]

7 голосов
/ 17 марта 2011

Вы можете использовать Критерии и с проекциями, чтобы получить имена пользователей, которым даны их идентификаторы, делая что-то вроде:

public List getUserNamesByIds(String[] ids) {
    def criteria = User.createCriteria()
    return criteria.list {
       projections {
         property("name")
       }
       'in'("id", ids)
    }
}

Затем вы можете преобразовать Список имен пользователей в строку, выполнив:

List users = getUserNamesByIds(...)
String concatenatedNames = (users ? users.join(",") : "")

Подробнее о критериях и проекциях можно прочитать в руководстве пользователя Grails .

1 голос
/ 17 марта 2011

Это ужасная идея. Причина в том, что каждый вызов User.get (id) делает вызов по проводной сети. Это очень дорого, и даже если ваша база данных ответит в течение 20 мс, выполнение 1000 из них займет 20 секунд - довольно длительное время для вашего пользователя. Лучшая идея состоит в том, чтобы получить набор пользователей, которые вас интересуют, с помощью какого-то запроса, а затем выполнить итерацию по ним, пока они находятся в памяти. Что занимает 1 нс или менее для каждого вызова цикла.

Эта реализация буквально является одной из основных причин медленных веб-приложений ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...