#nhibernate
#nhibernate
Вопрос:
Я уже отправлял этот вопрос в nh group, но до сих пор не получил ответа, поэтому размещаю его здесь. У меня небольшая проблема с быстрой загрузкой дочерней коллекции и получением правильного результата при подкачке с использованием setMaxResults.
Допустим, у меня есть простые объекты:
public class Post
{
int Id {get; set;}
Vote Votes {get; set;}
}
public class Vote
{
int Id {get; set;}
}
Вначале у меня была отложенная загрузка коллекции голосов, и она работала хорошо, за исключением N 1 инструкций SELECT.
Затем я попытался быстро получить коллекцию «Голосов», которая работала хорошо, но на стороне базы данных были дубликаты (если у одного сообщения 3 голоса, у нас будет 3 строки в результирующем SQL-запросе) Я использовал Distinctrootentitytytransformer, который также хорошо работал, за исключением setMaxResults. Поскольку setMaxResults ограничивает результаты на стороне базы данных, мы получим меньше результатов, чем ожидалось, на стороне объекта после применения DistinctRootEntityTransformer.
Я просмотрел сообщения в блоге, вопросы StackOverflow, перепробовал множество вещей, таких как выборка, LeftOuterJoins, подзапросы, отдельные критерии, но не нашел никакого решения для моей проблемы. Проблема также описана здесь http://www.interworks.com/blogs/banderton/2009/06/26/nhibernate-eager-loading-collections-rootentityresulttransformer-and-setm .
На данный момент я вижу три решения: получить неверный номер результата с помощью setMaxResults, сохранить SELECT N 1 или установить размер пакета для отложенной загрузки коллекции ‘vote’, и это то, что я сделал. Проблема последней версии заключается в том, что NHProf выдает предупреждение «неограниченный набор результатов» для пакетного выбора, потому что это не оптимально.
Возможно, я чего-то не понимаю. Есть ли какое-либо решение для правильного решения?
Заранее спасибо,
Ответ №1:
Я бы отложил загрузку и попытался добавить batch size
к вашему отображению, чтобы облегчить проблему выбора n 1.
<bag name="Votes" cascade="all" batch-size="20">
..
</bag>
В принципе, значение batch-size
20 уменьшит количество запросов, отправляемых в базу данных, в 20 раз. Без этого параметра, если бы у вас было 99 строк, вы бы отправили 99 запросов к базе данных с набором размера пакета, который вы бы отправили 5.
Быстрое объединение приводит к Cartesian join
и, следовательно, подкачка по страницам будет некорректной. Также имейте в виду, что DistinctRootEntity
обеспечивает фильтрацию данных NOT
только на стороне клиента фактически в самой базе данных.
Комментарии:
1. Это то, что я сделал. Я думаю, что это лучшее решение, однако NHProf выдает предупреждение «неограниченный набор результатов» для пакетного выбора, потому что это не оптимально. Я думаю, мы не можем иметь все 🙂 В любом случае 1 за ваше время и за подтверждение моих выводов 🙂