我试图从特定表的数据库中获取数据,其中没有连接到另一个表,或者存在但是它不是正确的数据。
结构
我有一个域表。所有这一切都是持有域名和其他一些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; }
}
我认为这是正确的数据结构?但如果我错了,请纠正我。它可能是我在做结构而不是查询本身。
答案 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变量进行比较。