Hibernate Criteria Query - Как искать во многих со многими с атрибутами? - PullRequest
0 голосов
/ 17 декабря 2009

Я пытаюсь создать запрос Criteria для выбора объектов, которые связаны через таблицу ассоциации.

Insurer * - 1 Insurer_Section 1 - * Section

InsurerSection имеет атрибут ассоциации: активный: bool.

Как получить всех страховщиков, чей активный атрибут в классе InsurerSection имеет значение true?

PS: я не могу так:

Insurer.FindAll(
DetachedCriteria.For<Insurer>().CreateCriteria("Insurer_Section").Add(Expression.Eq("Active", true)
);

потому что Insurer_Section является таблицей ассоциации, которая отображается только через HasAndBelongsToMany:

[HasAndBelongsToMany(typeof(Section), Table = "`Insurer_Section`", 
            ColumnKey = "`IdInsurer`", ColumnRef = "`IdSection`",
            Cascade = ManyRelationCascadeEnum.AllDeleteOrphan)]
        private IList<Section> Sections {
            get { return this.sections; }
            set { this.sections = value; }
        }

И

[HasAndBelongsToMany(typeof(Insurer), Table = "`Insurer_Section`",
            ColumnKey = "`IdSection`", ColumnRef = "`IdInsurer`",
            Cascade = ManyRelationCascadeEnum.None, Inverse = true)]
        public IList<Insurer> Insurers {
            get { return this.insurers; }
            set { this.insurers = value; }
        }

Ответы [ 2 ]

2 голосов
/ 17 декабря 2009

Вы не можете сделать это, если у вашей таблицы ассоциации есть свойства, которые вам нужны, вы должны сопоставить ассоциацию как один-ко-многим (с новым объектом для Insurer_Section), который затем имеет множество-к-одному отношение к разделу.

В тот момент, когда таблица ассоциации становится больше, чем просто первичными ключами и возможными столбцами индекса, вам необходимо отобразить таблицу ассоциации как отдельный объект, связывающий эти два объекта (страховщик и раздел вместе с информацией об ассоциации, например, IsActive)

0 голосов
/ 18 декабря 2009

Торкель правильный. Вам нужно не только создать новый связывающий объект, но и изменить коллекцию для каждого из объектов на набор вашего нового связующего объекта. Затем измените сопоставления соответствующим образом.

...