Я работаю над проектом .NET C #, в котором мне пришлось использовать атрибуты сопоставления NHibernate для сопоставления моих объектов моим таблицам в моей базе данных.
Теперь давайте объясним, в чем моя проблема.
У меня есть два сопоставленных класса, например, ClassA и ClassB. В моей базе данных таблица A содержит внешний ключ, ссылающийся на первичный ключ таблицы B. Следовательно, я добавил в ClassA экземпляр ClassB, отображенный в много-к-одному:
private ClassB b;
[ManyToOne(0, Name = "B", Column = "ID_TABLE_B_TABLE_A", Class = "ClassB", Update = false, Insert = false)]
public virtual ClassB B
{
get { return b; }
set { b= value; }
}
Теперь я хочу проверить значение поля ClassB при доступе к ClassA. Я пишу запрос на HQL:
Session.CreateQuery("select a.Id from ClassA a where a.ClassB.Name = 'xxx' ");
Вот сгенерированный SQL:
select tablea0_.ID_TABLE_A as col_0_0_
from TABLE_A tablea0_, TABLE_B tableb1_
where tablea0_.ID_TABLE_B_TABLE_A = tableb1_.ID_TABLE_B
and tableb1_.NAME_TABLE_B='xxx'
Я думал, что такого рода HQL-запрос должен был генерировать оператор соединения, а не оператор where, так как я определил связь многих к одному между двумя классами. Примерно так было бы лучше:
select tablea0_.ID_TABLE_A as col_0_0_
from TABLE_A tablea0_
left join TABLE_B tableb1_ on tableb1_.ID_TABLE_B = tablea0_.ID_TABLE_B_TABLE_A
where tableb1_.NAME_TABLE_B='xxx'
По-моему, присоединение выглядит чище, где. Я хотел бы знать, есть ли способ соответствующим образом настроить поведение NHibernate, не указывая явно оператор соединения в запросе HQL.
Любая помощь будет оценена!