HQL查询 - 城堡活动记录 - 外部联接

时间:2011-06-24 22:51:10

标签: nhibernate hql castle-activerecord

我试图从特定表的数据库中获取数据,其中没有连接到另一个表,或者存在但是它不是正确的数据。

结构

我有一个域表。所有这一切都是持有域名和其他一些misc元数据。

我有一个功能表,所有这些都是一个ID列,以及一个用于该功能值的列。例如。它看起来像这样:

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

等。

我有一个DomainData表。这保存了要素的值。列是这样的。

ID | DomainId | FeatureId |值

本质上它保存了该域的特征值,类似于键值列,因此它可以在不修改Domain表的表结构的情况下进行扩展。

现在,我需要做的是对所有没有功能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; }

这是我的Domain Class中的内容:

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 个答案:

答案 0 :(得分:1)

检查一下:

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

注意我正在映射的实体IS NULL上调用Feature,但结果查询将检查实际的FK列。作为一个注释,我发现奇怪的是你需要为featureid检查null,因为你还要与我猜测的@FeatureId变量进行比较。