2009-12-02 3 views
1

Извините за загадочным названием ..NHibernate критерии, выберите по количеству имущества

Не могли бы вы помочь мне, о том, как сделать выбор, основываясь на подсчете имущества, используя критерии? У меня есть объект (Pool) с свойством (PoolItems), и я хочу выбрать все пулы w. более 5 PoolItems.

ответ

5

Попробуйте это:

DetachedCriteria dCriteria = DetachedCriteria.For<PoolItem>("pItem") 
      .SetProjection(Projections.Count("Id")) 
      .Add(Restrictions.EqProperty("pItem.PoolID", "pool.Id")); 

IList<Post> posts = Session.CreateCriteria<Pool>("pool") 
       .Add(Subqueries.Gt(5, dCriteria)).List<Pool>(); 

Предполагая, что таблица PoolItem имеет столбец PoolID в качестве внешнего ключа таблицы пула. Отношения - один-ко-многим. Если у вас нет свойства PoolID, отображаемого в классе PoolItem, и вы просто имеете сопоставление объектов «один-два-один» с именем «Пул», то замените в выделенном критерии «pItem.PoolID» на «pItem.Pool.Id».

+0

Хорошо, это очень помогло, но я еще не совсем там. Отображение на самом деле не представлено в классе PoolItem, только через внешний ключ в базе данных и отображение класса пула. Должен ли я разоблачить отношения через свойство Pool или есть другой/лучший способ выполнить это? Я знаю, что могу сделать это с помощью SQL, но я бы скорее изучил способ Criteria: o) – hhravn

+0

Сопоставление свойства Pool в классе PoolItem - это не только хорошая идея относительно представления схем сущностей, но и хорошая идея, потому что это позволяет использовать эту взаимосвязь для выполнения подобных действий. Если вы предпочитаете не иметь такого свойства в своем классе, потому что хотите, чтобы используемый код не имел доступа к пулу или свойству PoolID (вы можете разоблачить их, если вам нравится только один, как только чтение) - insert = "false" update = "false"), вы можете вместо этого сопоставить это личное поле (access = "field"). – tolism7

Смежные вопросы