distinctrootentitytytransformer с setMaxResults или N 1 ВЫБОРОМ

#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 за ваше время и за подтверждение моих выводов 🙂