В проекте, над которым я работаю, есть некоторый код, в котором динамический поиск ведет себя иначе в одной ветке кода, чем в другой.
Эта строка кода возвращает всех моих рекламодателей (их 8), независимо от того, в какой ветке я нахожусь.
Advertiser.findAllByOwner(ownerInstance)
Но когда я начинаю добавлять условия, все становится странно. В ветке A следующий код возвращает всех моих рекламодателей:
Advertiser.findAllByOwner(ownerInstance, [max: 25])
Но в ветке B этот код возвращает только 1 рекламодателя.
Кажется невероятным, чтобы изменения в коде приложения могли повлиять на работу динамического поиска. Я ошибся? Есть ли что-то еще, что может привести к тому, что это не сработает?
Изменить
Меня попросили опубликовать определения моих классов. Вместо того, чтобы публиковать все это, я собираюсь опубликовать то, что я считаю важной частью:
static mapping = {
owner fetch: 'join'
category fetch: 'join'
subcategory fetch: 'join'
}
static fetchMode = [
grades: 'eager',
advertiserKeywords: 'eager',
advertiserConnections: 'eager'
]
Этот код присутствовал в ветке B, но отсутствовал в ветке A. Когда я вытаскиваю его, все работает, как и ожидалось.
Я решил еще немного покопаться с этим кодом, чтобы посмотреть, что я могу наблюдать. Я нашел кое-что интересное, когда использовал withCriteria
вместо динамического поиска:
Advertiser.withCriteria{owner{idEq(ownerInstance.id)}}
Я обнаружил, что это вернуло тысячи дубликатов! Итак, я попытался использовать listDistinct
:
Adviertiser.createCriteria().listDistinct{owner{idEq(ownerInstance.id)}}
Теперь это возвращает всех 8 моих рекламодателей без дубликатов. Но что, если я попытаюсь ограничить результаты?
Advertiser.createCriteria().listDistinct{
owner{idEq(ownerInstance.id)}
maxResults 25
}
Теперь это возвращает один результат, как это делает мой динамический поиск. Когда я разогнал maxResults
до 100 тыс., теперь я получаю все 8 результатов.
Так что же происходит? Кажется, что объединение или нетерпеливая выборка (или и то, и другое) сгенерировали sql, который вернул тысячи дубликатов. Динамические средства поиска Grails по умолчанию должны возвращать разные результаты, поэтому, когда я не ограничивал их, я не заметил ничего странного. Но как только я установил ограничение, поскольку записи были упорядочены по идентификатору, все первые 25 записей были бы повторяющимися записями, а это означает, что будет возвращена только одна отдельная запись.
Что касается объединений и нетерпеливой выборки, я не знаю, какую проблему пытался решить этот код, поэтому я не могу сказать, необходимо это или нет; вопрос в том, почему наличие этого кода в моем классе создает так много дубликатов?
max
показываетwhere this_.owner_id=?
, а запрос с[max: 25]
показываетwhere this_.owner_id=? limit ?
- person Samo   schedule 22.04.2013