HQL Query - Castle Active Record - Внешние соединения - PullRequest
0 голосов
/ 25 июня 2011

Я пытаюсь получить данные из БД определенной таблицы, где нет или нет соединения с другой таблицей, или есть, но это не те данные.

Структура

У меня есть таблица доменов.Все, что это делает, это содержит доменное имя и несколько других разнородных метаданных.

У меня есть таблица характеристик, все это имеет столбец идентификатора и столбец для значения этой функции.Например, это может выглядеть так:

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.Потратил много времени на это сейчас, и я либо ничего не получаю, либо я возвращаю ВСЕ домены, независимо от их идентификатора функции.К сожалению, я удалил все операторы 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 Ответ

1 голос
/ 27 июня 2011

проверьте это:

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

обратите внимание, что я звоню IS NULL на сопоставленную сущность Feature, но результирующий запрос проверит фактический столбец FK.В качестве комментария я нахожу странным, что вам нужно проверить NULL на featureid, поскольку вы также сравниваете с переменной @FeatureId, которая, как я предполагаю, не равна нулю.

...