2011-06-24 37 views
0

我想從特定表的數據庫中獲取數據,其中或者沒有連接到另一個表,或者存在但它不是正確的數據。HQL查詢 - 城堡活動記錄 - 外部加入

結構

我有一個域表。所有這些都包含域名和其他一些其他元數據。

我有一個功能表,所有這些都是一個ID列,併爲該功能的值的列。例如。它看起來是這樣的:

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

等等

我有一個DomainData表。這保存了這些功能的值。列是這樣的。

ID | DomainId | FeatureId |值

本質上,它保存該域的功能值,類似於鍵值列,這樣它可以在不修改域表的表結構的情況下進行擴展。

現在,我需要做的是爲不具備的特徵X.

例如所有域做一個查詢,這部作品在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 

,在SQL工作正常,並返回所有需要的數據。所有這一切都是抓住所有或者沒有任何功能的域名,或者他們確實有功能,但不是我需要的功能。

現在我正在使用CastleActiveRecord作爲我的數據層,但我很努力地知道如何在HQL中編寫它。現在花了很多時間在上面,我要麼沒有收回任何東西,要麼回到所有的域名,不管他們的功能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

檢查了這一點:

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

注意到,我的映射實體Feature調用IS NULL但結果查詢將檢查實際的FK列。作爲一個評論,我覺得你奇怪的是,你需要檢查爲featureid爲null,因爲你還與@FeatureId變量,我猜不是null。