Подклассы HQL Query 2 с одноименным свойством - PullRequest
1 голос
/ 09 ноября 2010

У меня есть 3 класса, как:

public class Animal
{
   ... all sort of data ...
}

public class Cat : Animal
{
   ... more data ...

   public virtual int Size { get; set; }
}

public class Dog : Animal
{
   ... other data ...

   public virtual int Size { get; set; }
}

Классы отображаются с использованием стратегии «таблица на иерархию» в hbm.xml, отображающей свойство Cat's Size, сопоставляемое со столбцом CatSize, а свойство Dog с DogSize

Следующие два запроса работают как положено:

From Cat o Where o.Size = 1
From Dog o Where o.Size = 1

Теперь я хочу запросить Animal для всех кошек, где Size = 1, и всех собак, где size = 1, объединяя два запроса выше, которые я получаю:

From Animal Where o.Size = 1 Or o.Size = 1

Это, очевидно, не делает то, что я хочу, как я могу сказать NHibernate, что первым Size является Cat.Size, а вторым - Dog.Size (желательно без знания имен столбцов в базе данных).

Примечание: я понимаю, что дизайн проблематичен, поскольку наличие двух свойств с одинаковыми именами в разных подклассах не является самым умным дизайнерским решением, которое когда-либо принималось, но изменить его сейчас еще более проблематично, и я бы хотел его избежать должен быть доставлен клиенту через несколько дней, и я действительно не хочу вносить изменения в дизайн сейчас.

Я использую NHibernate 2.0.1 (обновление не является вариантом, программа не работает с более поздними версиями NHibernate, и у нас нет времени, чтобы исправить это сейчас).

Ответы [ 2 ]

1 голос
/ 11 ноября 2010

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

select a from Animal a where a in (select c from Cat c where c.Size = 1) or a in (select d from Dog d where d.Size = 1)
1 голос
/ 09 ноября 2010

Почему вы не определили свойство Size в классе Animal?

Вы можете использовать MultiQuery для выполнения 2 запросов за один прием, и это также даст вам результаты,Я думаю, что это будет лучшим решением ...

IMultiQuery q = session.CreateMultiQuery();
q.Add("from Cat where Size = 1");
q.Add("from Dog where Size = 1");

var results = q.List();
var cats = (IList)results[0];
var dogs = (IList)results[1];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...