2013-04-03 2 views
0

Как написать этот выбор, используя объекты NHibernate?NHibernate выбрать из более чем одной таблицы

Select a.Id, a.Name, b.Data 
From Table1 a, Table2 b 
Where a.Id between :1 and :2 
And :3 = b.Period(+) 
And 1 = b.Type(+) 
And a.Id = b.Table1Id(+) 
Order by 1 

I.e. он дает все таблицы Table1 с таблицей2.Дата для каждой строки, даже если для нее нет данных таблицы2 (тогда будет задано 0 или нуль)

Классы и сопоставления для таблиц 1 и таблицы 2 уже созданы и работают. Также добавлена ​​ссылка для b.Table1Id.

Таким образом, проблема в основном (+) оператора.

Сопряжения: Таблица 1 очень проста и не относится ни к каким таблицам. Table2:

Table("Table2"); 
CompositeId() 
.KeyProperty(x => x.Type) 
.KeyProperty(x => x.Table1Id) 
.KeyProperty(x => x.Period); 
Map(x => x.Type); 
Map(x => x.Table1Id); 
Map(x => x.Period); 
Map(x => x.Data); 
ReferencesAny(x => x.TableG) 
.IdentityType<string>() 
.EntityTypeColumn("Type") 
.EntityIdentifierColumn("Table1Id") 
.AddMetaValue<Table1>("1") 
.AddMetaValue<Table33>("33"); 

Table1 и Table33 ingerites от одного родительского класса TableG. Соответственно, запрос Sql обновляется.

+0

Вы также можете показать сопоставления? и что вы пытались запустить этот запрос в nhibernate? – mridula

+0

Сопоставления добавлены. И я не пытался это делать вообще, я не знаю, с чего начать. – Ksice

ответ

1

Вы можете сделать что-то подобное, чтобы получить записи. И используйте прогнозы для выбора полей, которые вы хотите. Существует аналогичный пример here, чтобы вы начали.

var queryResult = Session.QueryOver<Table2>() 
        .Left.JoinAlias(table2 => x.Period,() => period) 
        .Where(table2 => table2.Id >= value1) 
        .Where(table2 => table2.Id <= value2) 
        .Where(table2 => table2.Type == 1) 
        .OrderBy(table2 => table2.Type).List<Table2>(); 
Смежные вопросы