2010-12-27 18 views
1

私はこのクエリは、次のSQLNHibernateはJoinQueryOverと遅延ロード

select this_.BaseEntity_id as BaseId0_1_ , 
     this_1_.Label as Label0_1_ , 
     this_1_.Description as Descript3_0_1_ , 
     this_1_.CreatedDate as CreatedD4_0_1_ , 
     this_.Width as Width2_1_ , 
     this_.Height as Height2_1_ , 
     this_.Duration as Duration2_1_ , 
     propertymu1_.id as id4_0_ , 
     propertymu1_.Name as Name4_0_ , 
     propertymu1_1_.DateTimeValue as DateTime2_5_0_ , 
     propertymu1_2_.IntegerValue as IntegerV2_6_0_ , 
     propertymu1_3_.DecimalValue as DecimalV2_7_0_ , 
     propertymu1_4_.StringValue as StringVa2_8_0_ 
from [Video] this_ 
     inner join [BaseEntity] this_1_ on this_.BaseEntity_id = this_1_.BaseId 
     inner join [PropertyMultTable] propertymu1_ on this_.BaseEntity_id = propertymu1_.BaseEntity_id 
     left outer join DateTimeValues propertymu1_1_ on propertymu1_.id = propertymu1_1_.PropertyMultTable_id 
     left outer join IntegerValues propertymu1_2_ on propertymu1_.id = propertymu1_2_.PropertyMultTable_id 
     left outer join DecimalValues propertymu1_3_ on propertymu1_.id = propertymu1_3_.PropertyMultTable_id 
     left outer join StringValues propertymu1_4_ on propertymu1_.id = propertymu1_4_.PropertyMultTable_id 
where (propertymu1_2_.IntegerValue >= 459144 
      and propertymu1_2_.IntegerValue <= 691982 
     ) 

をクエリ

var query = _session.QueryOver<TEntity>().JoinQueryOver<PropertyMultTable>(p => p.Properties).Where(propertyPredicate).List(); 

を生成しているが、私はプロパティせず、唯一のエンティティを取得したいです。このように、

select this_.BaseEntity_id as BaseId0_1_ , 
     this_1_.Label as Label0_1_ , 
     this_1_.Description as Descript3_0_1_ , 
     this_1_.CreatedDate as CreatedD4_0_1_ , 
     this_.Width as Width2_1_ , 
     this_.Height as Height2_1_ , 
     this_.Duration as Duration2_1_ 
from [Video] this_ 
     inner join [BaseEntity] this_1_ on this_.BaseEntity_id = this_1_.BaseId 
     inner join [PropertyMultTable] propertymu1_ on this_.BaseEntity_id = propertymu1_.BaseEntity_id 
     left outer join DateTimeValues propertymu1_1_ on propertymu1_.id = propertymu1_1_.PropertyMultTable_id 
     left outer join IntegerValues propertymu1_2_ on propertymu1_.id = propertymu1_2_.PropertyMultTable_id 
     left outer join DecimalValues propertymu1_3_ on propertymu1_.id = propertymu1_3_.PropertyMultTable_id 
     left outer join StringValues propertymu1_4_ on propertymu1_.id = propertymu1_4_.PropertyMultTable_id 
where (propertymu1_2_.IntegerValue >= 459144 
      and propertymu1_2_.IntegerValue <= 691982 
     ) 

や、さえはるかに良い::だから、私はこのようなSQLが必要

select distinct this_.BaseEntity_id as BaseId0_1_ , 
     this_1_.Label as Label0_1_ , 
     this_1_.Description as Descript3_0_1_ , 
     this_1_.CreatedDate as CreatedD4_0_1_ , 
     this_.Width as Width2_1_ , 
     this_.Height as Height2_1_ , 
     this_.Duration as Duration2_1_ 
from [Video] this_ 
     inner join [BaseEntity] this_1_ on this_.BaseEntity_id = this_1_.BaseId 
     inner join [PropertyMultTable] propertymu1_ on this_.BaseEntity_id = propertymu1_.BaseEntity_id 
     left outer join IntegerValues propertymu1_2_ on propertymu1_.id = propertymu1_2_.PropertyMultTable_id 
where (propertymu1_2_.IntegerValue >= 459144 
      and propertymu1_2_.IntegerValue <= 691982 
     ) 

は私が流暢NHibernateはでこれを行うことができますか?回答ありがとう。

+0

あなたがビデオのクラス宣言を追加することはできますか? – Baz1nga

+0

ビデオは幅、高さ、および長さの3つのプロパティを持つクラスであり、Id、ラベル、説明、およびCreatedDateのプロパティのみを含むBaseEntityから派生したものです – msi

+0

流暢なNHibernateはクエリを作成するのではなく、 。 –

答えて

0

ここでは、HQLを使用してそれを行う方法を説明します。上記のクエリで述べたように、ここで

var hqlQuery=string.Format("select v from Video as v inner join v.BaseEntity 
as be inner join v.PropertyMultTable as pmt left outer join pmt.IntegerValues 
as iv where be.BaseEntity_id=v.BaseId and be.BaseEntity_id=pmt.BaseEntity_id and 
pmt.Id=iv.PropertyMultTable_id and iv.IntegerValue >={0} and iv.IntegerValue 
<={1}", 459144,691982); 

ノートプロパティ名を仮定イムに行われる内部結合は同じです。彼らはあなたのプロパティを言及すると全く同じものでなければなりません、またはあなたはnhibernate例外を取得します。

もしそれが動作しない場合は、クラス図全体を投稿してください。

次のようにこのクエリを実行することができます:たぶんFuture()使用

session.CreateQuery(hqlquery).List<Video>(); 
+0

これは私の目標の解決策ではありません。私はジェネリックリポジトリを持っているので、イメージやドキュメントのような別のクラスをTEntityとして取ることができるので、HQLは必要ありません。 – msi

+0

次に、Criteriaクエリを検討するべきでしょう。あなたが私にクラス図を提供すれば、私はあなたを助けることができます。 – Baz1nga

0

var query = 
    _session.QueryOver<TEntity>() 
    .JoinQueryOver<PropertyMultTable>(p => p.Properties) 
    .Future() 
    .Where(propertyPredicate).List();