2011-06-24 23 views
0

特定のテーブルのDBからデータを取得しようとしていますが、別のテーブルへの結合がないか、存在していますが、正しいデータではありません。HQLクエリ - キャッスルアクティブレコード - 外部結合

構造

私はドメインテーブルを持っています。これはドメイン名と他のいくつかのその他のメタデータを保持しています。

私はフィーチャーテーブルを持っています。これはすべてIDカラムであり、そのフィーチャーの値の列です。例えば。私はDomainDataテーブルを持っている

1 | First Registered 
2 | Expired On 
3 | Hosted On 

:それはこのようになります。これは、フィーチャーの値を保持します。列はこのようなものです。

ID |ドメインID | FeatureId |値

ドメインテーブルのテーブル構造を変更せずに拡張することができるように、キー値列のような機能は、基本的にそのドメインの機能の値を保持します。

は今、私は何をする必要があるかの機能X.例えば

を持っていないすべてのドメインに対してクエリを実行され、これはSQLで動作します。

SQLで正常に動作します
SELECT D.* 
FROM Domain AS D 
LEFT OUTER JOIN DomainData AS Data ON Data.DomainId = D.Id 
WHERE data.featureId IS NULL OR data.FeatureId != @FeatureId 

、必要なすべてのデータを返します。すべての機能は、機能を持たないドメイン、または機能を備えているドメインですが、必要なドメインはありません。

私はデータレイヤーとしてCastleActiveRecordを使用していますが、これをHQLでどのように書くことができるかについては苦労しています。これで1時間以上を費やしてしまい、何も返されないか、機能IDに関係なくすべてのドメインが返されます。残念ながら、私が試したすべてのHQLステートメントを削除しました。

私は上記のステートメントをHQLに書き換える方法についていくつかの助けを得ることができますか?

側注:私のクラスの中では、私はDomainDataクラス内でこれを持っている:

[BelongsTo("DomainId")] 
    public Domain Domain { get; set; } 

    [BelongsTo("FeatureId")] 
    public Feature Feature { get; set; } 

そして、これを自分のドメインクラス内:

private IList<DomainData> featureData = new List<DomainData>(); 
    [HasMany(typeof(DomainData), Table = "DomainData", ColumnKey = "DomainId")] 
    public IList<DomainData> FeatureData 
    { 
     get { return featureData; } 
     set { featureData = value; } 
    } 

が、私はそれが正しいデータ構造であると思いますか?しかし、私が間違っていれば私を修正してください。クエリ自体ではなく構造をやっているのかもしれません。

答えて

1

チェックこのアウト:私がマッピングされたエンティティFeatureIS NULLを呼んでいる、まだ結果のクエリは、実際のFK列をチェックします

select d 
from Domain d left join d.DomainData ddata 
where ddata.Feature is null OR ddata.Feature.Id <> :featureId 

予告。コメントとして、あなたがnullでないと推測している@FeatureId変数とも比較するので、featureidのnullをチェックする必要があることは奇妙です。